= T;
+}
+
+declare module "react-native/Libraries/Utilities/codegenNativeComponent" {
+ import type {HostComponent} from "react-native";
+
+ export default function codegenNativeComponent(
+ componentName: string,
+ ): HostComponent
;
+}
+
+declare module "@react-native-community/slider" {
+ import type * as React from "react";
+ import type {ViewProps} from "react-native";
+
+ export type MarkerProps = {
+ stepMarked: boolean;
+ currentValue: number;
+ index: number;
+ min: number;
+ max: number;
+ };
+
+ export type SliderProps = ViewProps &
+ Readonly<{
+ [key: string]: any;
+ onSlidingComplete?: (value: number) => void;
+ onSlidingStart?: (value: number) => void;
+ onValueChange?: (value: number) => void;
+ StepMarker?: React.FC;
+ renderStepNumber?: boolean;
+ }>;
+
+ const Slider: React.ForwardRefExoticComponent;
+ export default Slider;
+}
diff --git a/example-web/src/resources/ck-icon.png b/example-web/src/resources/ck-icon.png
new file mode 100644
index 00000000..ee9e527f
Binary files /dev/null and b/example-web/src/resources/ck-icon.png differ
diff --git a/example-web/src/resources/empty.png b/example-web/src/resources/empty.png
new file mode 100644
index 00000000..503d58bb
Binary files /dev/null and b/example-web/src/resources/empty.png differ
diff --git a/example-web/src/resources/twitter-small.png b/example-web/src/resources/twitter-small.png
new file mode 100644
index 00000000..fb1f11f3
Binary files /dev/null and b/example-web/src/resources/twitter-small.png differ
diff --git a/example/.bundle/config b/example/.bundle/config
new file mode 100644
index 00000000..848943bb
--- /dev/null
+++ b/example/.bundle/config
@@ -0,0 +1,2 @@
+BUNDLE_PATH: "vendor/bundle"
+BUNDLE_FORCE_RUBY_PLATFORM: 1
diff --git a/example/.eslintrc.js b/example/.eslintrc.js
index dcf0be08..187894b6 100644
--- a/example/.eslintrc.js
+++ b/example/.eslintrc.js
@@ -1,16 +1,4 @@
module.exports = {
root: true,
- extends: '@react-native-community',
- parser: '@typescript-eslint/parser',
- plugins: ['@typescript-eslint'],
- overrides: [
- {
- files: ['*.ts', '*.tsx'],
- rules: {
- '@typescript-eslint/no-shadow': ['error'],
- 'no-shadow': 'off',
- 'no-undef': 'off',
- },
- },
- ],
+ extends: '@react-native',
};
diff --git a/example/.gitignore b/example/.gitignore
new file mode 100644
index 00000000..de999559
--- /dev/null
+++ b/example/.gitignore
@@ -0,0 +1,75 @@
+# 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
+.kotlin/
+
+# 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/example/.prettierrc.js b/example/.prettierrc.js
new file mode 100644
index 00000000..06860c8d
--- /dev/null
+++ b/example/.prettierrc.js
@@ -0,0 +1,5 @@
+module.exports = {
+ arrowParens: 'avoid',
+ singleQuote: true,
+ trailingComma: 'all',
+};
diff --git a/example/.prettierrc.json b/example/.prettierrc.json
deleted file mode 100644
index fe440a6a..00000000
--- a/example/.prettierrc.json
+++ /dev/null
@@ -1,7 +0,0 @@
-{
- "arrowParens": "avoid",
- "bracketSameLine": true,
- "bracketSpacing": false,
- "singleQuote": true,
- "trailingComma": "all"
-}
diff --git a/example/.watchmanconfig b/example/.watchmanconfig
new file mode 100644
index 00000000..0967ef42
--- /dev/null
+++ b/example/.watchmanconfig
@@ -0,0 +1 @@
+{}
diff --git a/example/App.tsx b/example/App.tsx
new file mode 100644
index 00000000..ece512e1
--- /dev/null
+++ b/example/App.tsx
@@ -0,0 +1 @@
+export {default} from "./src/App";
diff --git a/example/Gemfile b/example/Gemfile
index 60770b18..51515233 100644
--- a/example/Gemfile
+++ b/example/Gemfile
@@ -8,9 +8,10 @@ gem 'cocoapods', '>= 1.13', '!= 1.15.0', '!= 1.15.1'
gem 'activesupport', '>= 6.1.7.5', '!= 7.1.0'
gem 'xcodeproj', '< 1.26.0'
gem 'concurrent-ruby', '< 1.3.4'
-
+
# Ruby 3.4.0 has removed some libraries from the standard library.
gem 'bigdecimal'
gem 'logger'
gem 'benchmark'
gem 'mutex_m'
+gem 'nkf'
diff --git a/example/Gemfile.lock b/example/Gemfile.lock
index ebdbf97b..14e521c4 100644
--- a/example/Gemfile.lock
+++ b/example/Gemfile.lock
@@ -1,28 +1,21 @@
GEM
remote: https://rubygems.org/
specs:
- CFPropertyList (3.0.7)
- base64
- nkf
- rexml
- activesupport (7.1.3.4)
- base64
- bigdecimal
+ CFPropertyList (3.0.9)
+ activesupport (6.1.7.10)
concurrent-ruby (~> 1.0, >= 1.0.2)
- connection_pool (>= 2.2.5)
- drb
i18n (>= 1.6, < 2)
minitest (>= 5.1)
- mutex_m
tzinfo (~> 2.0)
- addressable (2.8.7)
- public_suffix (>= 2.0.2, < 7.0)
+ zeitwerk (~> 2.3)
+ addressable (2.9.0)
+ public_suffix (>= 2.0.2, < 8.0)
algoliasearch (1.27.5)
httpclient (~> 2.8, >= 2.8.3)
json (>= 1.5.1)
atomos (0.1.3)
- base64 (0.2.0)
- bigdecimal (3.1.1)
+ benchmark (0.5.0)
+ bigdecimal (4.1.2)
claide (1.1.0)
cocoapods (1.15.2)
addressable (~> 2.8)
@@ -62,56 +55,60 @@ GEM
netrc (~> 0.11)
cocoapods-try (1.2.0)
colored2 (3.1.2)
- concurrent-ruby (1.3.4)
- connection_pool (2.4.1)
- drb (2.1.0)
- ruby2_keywords
+ concurrent-ruby (1.3.3)
escape (0.0.4)
- ethon (0.16.0)
+ ethon (0.18.0)
ffi (>= 1.15.0)
- ffi (1.17.0-arm64-darwin)
- ffi (1.17.0-x86_64-linux-gnu)
+ logger
+ ffi (1.17.4)
fourflusher (2.3.1)
fuzzy_match (2.0.4)
gh_inspector (1.1.3)
- httpclient (2.8.3)
- i18n (1.14.5)
+ httpclient (2.9.0)
+ mutex_m
+ i18n (1.14.8)
concurrent-ruby (~> 1.0)
- json (2.7.2)
- minitest (5.25.1)
+ json (2.7.6)
+ logger (1.7.0)
+ minitest (5.25.4)
molinillo (0.8.0)
- mutex_m (0.1.1)
+ mutex_m (0.3.0)
nanaimo (0.3.0)
nap (1.1.0)
netrc (0.11.0)
- nkf (0.2.0)
+ nkf (0.3.0)
public_suffix (4.0.7)
- rexml (3.3.9)
+ rexml (3.4.4)
ruby-macho (2.5.1)
- ruby2_keywords (0.0.5)
- typhoeus (1.4.1)
- ethon (>= 0.9.0)
+ typhoeus (1.6.0)
+ ethon (>= 0.18.0)
tzinfo (2.0.6)
concurrent-ruby (~> 1.0)
- xcodeproj (1.25.0)
+ xcodeproj (1.25.1)
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.3.2, < 4.0)
+ rexml (>= 3.3.6, < 4.0)
+ zeitwerk (2.6.18)
PLATFORMS
- arm64-darwin
- x86_64-linux
+ ruby
DEPENDENCIES
activesupport (>= 6.1.7.5, != 7.1.0)
+ benchmark
+ bigdecimal
cocoapods (>= 1.13, != 1.15.1, != 1.15.0)
+ concurrent-ruby (< 1.3.4)
+ logger
+ mutex_m
+ nkf
xcodeproj (< 1.26.0)
RUBY VERSION
- ruby 3.1.2p20
+ ruby 2.6.10p210
BUNDLED WITH
- 2.5.17
+ 1.17.2
diff --git a/example/README.md b/example/README.md
new file mode 100644
index 00000000..3e2c3f85
--- /dev/null
+++ b/example/README.md
@@ -0,0 +1,97 @@
+This is a new [**React Native**](https://reactnative.dev) project, bootstrapped using [`@react-native-community/cli`](https://github.com/react-native-community/cli).
+
+# Getting Started
+
+> **Note**: Make sure you have completed the [Set Up Your Environment](https://reactnative.dev/docs/set-up-your-environment) guide before proceeding.
+
+## Step 1: Start Metro
+
+First, you will need to run **Metro**, the JavaScript build tool for React Native.
+
+To start the Metro dev server, run the following command from the root of your React Native project:
+
+```sh
+# Using npm
+npm start
+
+# OR using Yarn
+yarn start
+```
+
+## Step 2: Build and run your app
+
+With Metro running, open a new terminal window/pane from the root of your React Native project, and use one of the following commands to build and run your Android or iOS app:
+
+### Android
+
+```sh
+# Using npm
+npm run android
+
+# OR using Yarn
+yarn android
+```
+
+### iOS
+
+For iOS, remember to install CocoaPods dependencies (this only needs to be run on first clone or after updating native deps).
+
+The first time you create a new project, run the Ruby bundler to install CocoaPods itself:
+
+```sh
+bundle install
+```
+
+Then, and every time you update your native dependencies, run:
+
+```sh
+bundle exec pod install
+```
+
+For more information, please visit [CocoaPods Getting Started guide](https://guides.cocoapods.org/using/getting-started.html).
+
+```sh
+# Using npm
+npm run ios
+
+# OR using Yarn
+yarn ios
+```
+
+If everything is set up correctly, you should see your new app running in the Android Emulator, iOS Simulator, or your connected device.
+
+This is one way to run your app — you can also build it directly from Android Studio or Xcode.
+
+## Step 3: Modify your app
+
+Now that you have successfully run the app, let's make changes!
+
+Open `App.tsx` in your text editor of choice and make some changes. When you save, your app will automatically update and reflect these changes — this is powered by [Fast Refresh](https://reactnative.dev/docs/fast-refresh).
+
+When you want to forcefully reload, for example to reset the state of your app, you can perform a full reload:
+
+- **Android**: Press the R key twice or select **"Reload"** from the **Dev Menu**, accessed via Ctrl + M (Windows/Linux) or Cmd ⌘ + M (macOS).
+- **iOS**: Press R in iOS Simulator.
+
+## Congratulations! :tada:
+
+You've successfully run and modified your React Native App. :partying_face:
+
+### Now what?
+
+- If you want to add this new React Native code to an existing application, check out the [Integration guide](https://reactnative.dev/docs/integration-with-existing-apps).
+- If you're curious to learn more about React Native, check out the [docs](https://reactnative.dev/docs/getting-started).
+
+# Troubleshooting
+
+If you're having issues getting the above steps to work, see the [Troubleshooting](https://reactnative.dev/docs/troubleshooting) page.
+
+# Learn More
+
+To learn more about React Native, take a look at the following resources:
+
+- [React Native Website](https://reactnative.dev) - learn more about React Native.
+- [Getting Started](https://reactnative.dev/docs/environment-setup) - an **overview** of React Native and how setup your environment.
+- [Learn the Basics](https://reactnative.dev/docs/getting-started) - a **guided tour** of the React Native **basics**.
+- [Blog](https://reactnative.dev/blog) - read the latest official React Native **Blog** posts.
+- [`@facebook/react-native`](https://github.com/facebook/react-native) - the Open Source; GitHub **repository** for React Native.
diff --git a/example/__tests__/App.test.tsx b/example/__tests__/App.test.tsx
new file mode 100644
index 00000000..b0446b41
--- /dev/null
+++ b/example/__tests__/App.test.tsx
@@ -0,0 +1,18 @@
+/**
+ * @format
+ */
+
+import React from 'react';
+import ReactTestRenderer from 'react-test-renderer';
+import App from '../App';
+
+jest.mock('react-native-pager-view', () => {
+ const {View} = require('react-native');
+ return ({children}: {children: React.ReactNode}) => {children} ;
+});
+
+test('renders correctly', async () => {
+ await ReactTestRenderer.act(() => {
+ ReactTestRenderer.create( );
+ });
+});
diff --git a/example/android/app/build.gradle b/example/android/app/build.gradle
index 004ae422..b5663008 100644
--- a/example/android/app/build.gradle
+++ b/example/android/app/build.gradle
@@ -8,20 +8,20 @@ apply plugin: "com.facebook.react"
*/
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")
+ // 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'.
+ // skip the bundling of the JS bundle and the assets. Default is "debug", "debugOptimized".
// If you add flavors like lite, prod, etc. you'll have to list your debuggableVariants.
- // debuggableVariants = ["liteDebug", "prodDebug"]
+ // debuggableVariants = ["liteDebug", "liteDebugOptimized", "prodDebug", "prodDebugOptimized"]
/* Bundling */
// A list containing the node command and its flags. Default is just 'node'.
@@ -49,8 +49,9 @@ react {
//
// The list of flags to pass to the Hermes compiler. By default is "-O", "-output-source-map"
// hermesFlags = ["-O", "-output-source-map"]
+
/* Autolinking */
- autolinkLibrariesWithApp()
+ autolinkLibrariesWithApp()
}
/**
diff --git a/example/android/app/src/debug/AndroidManifest.xml b/example/android/app/src/debug/AndroidManifest.xml
deleted file mode 100644
index eb98c01a..00000000
--- a/example/android/app/src/debug/AndroidManifest.xml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml
index 4122f36a..fb78f397 100644
--- a/example/android/app/src/main/AndroidManifest.xml
+++ b/example/android/app/src/main/AndroidManifest.xml
@@ -8,7 +8,9 @@
android:icon="@mipmap/ic_launcher"
android:roundIcon="@mipmap/ic_launcher_round"
android:allowBackup="false"
- android:theme="@style/AppTheme">
+ android:theme="@style/AppTheme"
+ android:usesCleartextTraffic="${usesCleartextTraffic}"
+ android:supportsRtl="true">
=
- 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(this.applicationContext, reactNativeHost)
+ override val reactHost: ReactHost by lazy {
+ getDefaultReactHost(
+ context = applicationContext,
+ packageList =
+ PackageList(this).packages.apply {
+ // Packages that cannot be autolinked yet can be added manually here, for example:
+ // add(MyReactNativePackage())
+ },
+ )
+ }
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()
- }
+ loadReactNative(this)
}
}
diff --git a/example/android/app/src/main/res/drawable/rn_edit_text_material.xml b/example/android/app/src/main/res/drawable/rn_edit_text_material.xml
index 73b37e4d..5c25e728 100644
--- a/example/android/app/src/main/res/drawable/rn_edit_text_material.xml
+++ b/example/android/app/src/main/res/drawable/rn_edit_text_material.xml
@@ -17,7 +17,8 @@
android:insetLeft="@dimen/abc_edit_text_inset_horizontal_material"
android:insetRight="@dimen/abc_edit_text_inset_horizontal_material"
android:insetTop="@dimen/abc_edit_text_inset_top_material"
- android:insetBottom="@dimen/abc_edit_text_inset_bottom_material">
+ android:insetBottom="@dimen/abc_edit_text_inset_bottom_material"
+ >
NSAllowsArbitraryLoads
NSAllowsLocalNetworking
@@ -34,17 +35,24 @@
NSLocationWhenInUseUsageDescription
+ RCTNewArchEnabled
+
UILaunchStoryboardName
LaunchScreen
UIRequiredDeviceCapabilities
- armv7
+ arm64
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
+
+ UISupportedInterfaceOrientations~ipad
+
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
+ UIInterfaceOrientationPortrait
+ UIInterfaceOrientationPortraitUpsideDown
UIViewControllerBasedStatusBarAppearance
diff --git a/example/ios/example/LaunchScreen.storyboard b/example/ios/example/LaunchScreen.storyboard
index a2139fff..4d6c54ad 100644
--- a/example/ios/example/LaunchScreen.storyboard
+++ b/example/ios/example/LaunchScreen.storyboard
@@ -16,12 +16,12 @@
-
+
-
+
diff --git a/example/jest.config.js b/example/jest.config.js
index 8eb675e9..294be30f 100644
--- a/example/jest.config.js
+++ b/example/jest.config.js
@@ -1,3 +1,3 @@
module.exports = {
- preset: 'react-native',
+ preset: '@react-native/jest-preset',
};
diff --git a/example/metro.config.js b/example/metro.config.js
index ba95bf4a..43c60157 100644
--- a/example/metro.config.js
+++ b/example/metro.config.js
@@ -1,4 +1,13 @@
-const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
+const path = require('path');
+const exclusionListModule = require('metro-config/private/defaults/exclusionList');
+const { getDefaultConfig, mergeConfig } = require('@react-native/metro-config');
+
+const packageRoot = path.resolve(__dirname, '../package');
+const exampleNodeModules = path.resolve(__dirname, 'node_modules');
+const packageNodeModules = path.resolve(packageRoot, 'node_modules');
+const exclusionList = exclusionListModule.default ?? exclusionListModule;
+
+const escapePath = value => value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
/**
* Metro configuration
@@ -6,6 +15,18 @@ const {getDefaultConfig, mergeConfig} = require('@react-native/metro-config');
*
* @type {import('@react-native/metro-config').MetroConfig}
*/
-const config = {};
+const config = {
+ watchFolders: [packageRoot],
+ resolver: {
+ blockList: exclusionList([
+ new RegExp(`${escapePath(packageNodeModules)}\\/.*`),
+ ]),
+ extraNodeModules: {
+ '@react-native-community/slider': packageRoot,
+ react: path.resolve(exampleNodeModules, 'react'),
+ 'react-native': path.resolve(exampleNodeModules, 'react-native'),
+ },
+ },
+};
module.exports = mergeConfig(getDefaultConfig(__dirname), config);
diff --git a/example/package-lock.json b/example/package-lock.json
index 2c5d4c09..306098bc 100644
--- a/example/package-lock.json
+++ b/example/package-lock.json
@@ -1,51 +1,45 @@
{
- "name": "example",
+ "name": "slider-example",
"version": "0.0.1",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
- "name": "example",
+ "name": "slider-example",
"version": "0.0.1",
"hasInstallScript": true,
"dependencies": {
+ "@mgcrea/react-native-jetpack-compose": "^0.8.0",
"@react-native-community/slider": "file:../package",
- "babel-preset-expo": "^9.2.0",
- "react": "^19.0.0",
- "react-native": "^0.79.2",
- "react-native-pager-view": "^6.6.0"
+ "react": "19.2.3",
+ "react-native": "0.85.1",
+ "react-native-pager-view": "^6.9.1"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.3",
"@babel/runtime": "^7.25.0",
- "@react-native-community/cli": "^20.0.2",
- "@react-native-community/cli-debugger-ui": "^16.0.0",
- "@react-native-community/cli-platform-android": "^20.0.2",
- "@react-native-community/cli-platform-ios": "^20.0.2",
- "@react-native-community/eslint-config": "^3.2.0",
- "@react-native/babel-preset": "0.79.2",
- "@react-native/eslint-config": "0.79.2",
- "@react-native/metro-config": "0.79.2",
- "@react-native/typescript-config": "0.79.2",
+ "@react-native-community/cli": "20.1.0",
+ "@react-native-community/cli-platform-android": "20.1.0",
+ "@react-native-community/cli-platform-ios": "20.1.0",
+ "@react-native/babel-preset": "0.85.1",
+ "@react-native/eslint-config": "0.85.1",
+ "@react-native/jest-preset": "0.85.1",
+ "@react-native/metro-config": "0.85.1",
+ "@react-native/typescript-config": "0.85.1",
"@types/jest": "^29.5.13",
- "@types/react": "^19.0.0",
- "@types/react-test-renderer": "^19.0.0",
- "@typescript-eslint/eslint-plugin": "^5.36.2",
- "@typescript-eslint/parser": "^5.36.2",
- "babel-jest": "^29.6.3",
+ "@types/react": "^19.2.0",
+ "@types/react-test-renderer": "^19.1.0",
"copyfiles": "^2.4.1",
"eslint": "^8.19.0",
- "eslint-plugin-prettier": "4.2.1",
"jest": "^29.6.3",
- "metro-config": "^0.80.7",
"prettier": "2.8.8",
- "react-test-renderer": "19.0.0",
+ "react-test-renderer": "19.2.3",
"rimraf": "^5.0.5",
- "typescript": "5.0.4"
+ "typescript": "^5.8.3"
},
"engines": {
- "node": ">=18"
+ "node": ">= 22.11.0"
}
},
"../package": {
@@ -12474,6 +12468,7 @@
},
"node_modules/@babel/helper-annotate-as-pure": {
"version": "7.27.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.3"
@@ -12498,6 +12493,7 @@
},
"node_modules/@babel/helper-create-class-features-plugin": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
@@ -12517,6 +12513,7 @@
},
"node_modules/@babel/helper-create-regexp-features-plugin": {
"version": "7.28.5",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
@@ -12532,6 +12529,7 @@
},
"node_modules/@babel/helper-define-polyfill-provider": {
"version": "0.6.8",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.28.6",
@@ -12544,16 +12542,6 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.24.7",
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.24.7"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/helper-globals": {
"version": "7.29.7",
"license": "MIT",
@@ -12563,6 +12551,7 @@
},
"node_modules/@babel/helper-member-expression-to-functions": {
"version": "7.28.5",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.28.5",
@@ -12600,6 +12589,7 @@
},
"node_modules/@babel/helper-optimise-call-expression": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.27.1"
@@ -12610,6 +12600,7 @@
},
"node_modules/@babel/helper-plugin-utils": {
"version": "7.29.7",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -12617,6 +12608,7 @@
},
"node_modules/@babel/helper-remap-async-to-generator": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.1",
@@ -12632,6 +12624,7 @@
},
"node_modules/@babel/helper-replace-supers": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-member-expression-to-functions": "^7.28.5",
@@ -12647,6 +12640,7 @@
},
"node_modules/@babel/helper-skip-transparent-expression-wrappers": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/traverse": "^7.27.1",
@@ -12679,6 +12673,7 @@
},
"node_modules/@babel/helper-wrap-function": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.28.6",
@@ -12715,6 +12710,7 @@
},
"node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
"version": "7.28.5",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1",
@@ -12729,6 +12725,7 @@
},
"node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -12742,6 +12739,7 @@
},
"node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -12755,6 +12753,7 @@
},
"node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1",
@@ -12770,6 +12769,7 @@
},
"node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
@@ -12782,53 +12782,9 @@
"@babel/core": "^7.0.0"
}
},
- "node_modules/@babel/plugin-proposal-async-generator-functions": {
- "version": "7.20.7",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-environment-visitor": "^7.18.9",
- "@babel/helper-plugin-utils": "^7.20.2",
- "@babel/helper-remap-async-to-generator": "^7.18.9",
- "@babel/plugin-syntax-async-generators": "^7.8.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-class-properties": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.18.6",
- "@babel/helper-plugin-utils": "^7.18.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-decorators": {
- "version": "7.29.0",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.28.6",
- "@babel/helper-plugin-utils": "^7.28.6",
- "@babel/plugin-syntax-decorators": "^7.28.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-proposal-export-default-from": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -12840,82 +12796,9 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-numeric-separator": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-object-rest-spread": {
- "version": "7.20.7",
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.20.5",
- "@babel/helper-compilation-targets": "^7.20.7",
- "@babel/helper-plugin-utils": "^7.20.2",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.20.7"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.18.6",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.18.6",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-optional-chaining": {
- "version": "7.21.0",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.20.2",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-proposal-private-property-in-object": {
"version": "7.21.0-placeholder-for-preset-env.2",
+ "dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -12926,6 +12809,7 @@
},
"node_modules/@babel/plugin-syntax-async-generators": {
"version": "7.8.4",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -12936,6 +12820,7 @@
},
"node_modules/@babel/plugin-syntax-bigint": {
"version": "7.8.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -12946,6 +12831,7 @@
},
"node_modules/@babel/plugin-syntax-class-properties": {
"version": "7.12.13",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.12.13"
@@ -12956,6 +12842,7 @@
},
"node_modules/@babel/plugin-syntax-class-static-block": {
"version": "7.14.5",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
@@ -12967,21 +12854,9 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-syntax-decorators": {
- "version": "7.28.6",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.28.6"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-syntax-dynamic-import": {
"version": "7.8.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -12992,6 +12867,7 @@
},
"node_modules/@babel/plugin-syntax-export-default-from": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13005,6 +12881,7 @@
},
"node_modules/@babel/plugin-syntax-flow": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13018,6 +12895,7 @@
},
"node_modules/@babel/plugin-syntax-import-assertions": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13031,6 +12909,7 @@
},
"node_modules/@babel/plugin-syntax-import-attributes": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13044,6 +12923,7 @@
},
"node_modules/@babel/plugin-syntax-import-meta": {
"version": "7.10.4",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
@@ -13054,6 +12934,7 @@
},
"node_modules/@babel/plugin-syntax-json-strings": {
"version": "7.8.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -13064,6 +12945,7 @@
},
"node_modules/@babel/plugin-syntax-jsx": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13077,6 +12959,7 @@
},
"node_modules/@babel/plugin-syntax-logical-assignment-operators": {
"version": "7.10.4",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
@@ -13087,6 +12970,7 @@
},
"node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
"version": "7.8.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -13097,6 +12981,7 @@
},
"node_modules/@babel/plugin-syntax-numeric-separator": {
"version": "7.10.4",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.10.4"
@@ -13107,6 +12992,7 @@
},
"node_modules/@babel/plugin-syntax-object-rest-spread": {
"version": "7.8.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -13117,6 +13003,7 @@
},
"node_modules/@babel/plugin-syntax-optional-catch-binding": {
"version": "7.8.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -13127,6 +13014,7 @@
},
"node_modules/@babel/plugin-syntax-optional-chaining": {
"version": "7.8.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.8.0"
@@ -13137,6 +13025,7 @@
},
"node_modules/@babel/plugin-syntax-private-property-in-object": {
"version": "7.14.5",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
@@ -13150,6 +13039,7 @@
},
"node_modules/@babel/plugin-syntax-top-level-await": {
"version": "7.14.5",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.14.5"
@@ -13163,6 +13053,7 @@
},
"node_modules/@babel/plugin-syntax-typescript": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13176,6 +13067,7 @@
},
"node_modules/@babel/plugin-syntax-unicode-sets-regex": {
"version": "7.18.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.18.6",
@@ -13190,6 +13082,7 @@
},
"node_modules/@babel/plugin-transform-arrow-functions": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13203,6 +13096,7 @@
},
"node_modules/@babel/plugin-transform-async-generator-functions": {
"version": "7.29.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
@@ -13218,6 +13112,7 @@
},
"node_modules/@babel/plugin-transform-async-to-generator": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.28.6",
@@ -13233,6 +13128,7 @@
},
"node_modules/@babel/plugin-transform-block-scoped-functions": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13246,6 +13142,7 @@
},
"node_modules/@babel/plugin-transform-block-scoping": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13259,6 +13156,7 @@
},
"node_modules/@babel/plugin-transform-class-properties": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.28.6",
@@ -13273,6 +13171,7 @@
},
"node_modules/@babel/plugin-transform-class-static-block": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.28.6",
@@ -13287,6 +13186,7 @@
},
"node_modules/@babel/plugin-transform-classes": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
@@ -13305,6 +13205,7 @@
},
"node_modules/@babel/plugin-transform-computed-properties": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
@@ -13319,6 +13220,7 @@
},
"node_modules/@babel/plugin-transform-destructuring": {
"version": "7.28.5",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1",
@@ -13333,6 +13235,7 @@
},
"node_modules/@babel/plugin-transform-dotall-regex": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.28.5",
@@ -13347,6 +13250,7 @@
},
"node_modules/@babel/plugin-transform-duplicate-keys": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13360,6 +13264,7 @@
},
"node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
"version": "7.29.0",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.28.5",
@@ -13374,6 +13279,7 @@
},
"node_modules/@babel/plugin-transform-dynamic-import": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13387,6 +13293,7 @@
},
"node_modules/@babel/plugin-transform-explicit-resource-management": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
@@ -13401,6 +13308,7 @@
},
"node_modules/@babel/plugin-transform-exponentiation-operator": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13414,6 +13322,7 @@
},
"node_modules/@babel/plugin-transform-export-namespace-from": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13427,6 +13336,7 @@
},
"node_modules/@babel/plugin-transform-flow-strip-types": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1",
@@ -13441,6 +13351,7 @@
},
"node_modules/@babel/plugin-transform-for-of": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1",
@@ -13455,6 +13366,7 @@
},
"node_modules/@babel/plugin-transform-function-name": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.27.1",
@@ -13470,6 +13382,7 @@
},
"node_modules/@babel/plugin-transform-json-strings": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13483,6 +13396,7 @@
},
"node_modules/@babel/plugin-transform-literals": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13496,6 +13410,7 @@
},
"node_modules/@babel/plugin-transform-logical-assignment-operators": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13509,6 +13424,7 @@
},
"node_modules/@babel/plugin-transform-member-expression-literals": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13522,6 +13438,7 @@
},
"node_modules/@babel/plugin-transform-modules-amd": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-transforms": "^7.27.1",
@@ -13536,6 +13453,7 @@
},
"node_modules/@babel/plugin-transform-modules-commonjs": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-transforms": "^7.28.6",
@@ -13550,6 +13468,7 @@
},
"node_modules/@babel/plugin-transform-modules-systemjs": {
"version": "7.29.7",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-transforms": "^7.29.7",
@@ -13566,6 +13485,7 @@
},
"node_modules/@babel/plugin-transform-modules-umd": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-transforms": "^7.27.1",
@@ -13580,6 +13500,7 @@
},
"node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
"version": "7.29.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.28.5",
@@ -13594,6 +13515,7 @@
},
"node_modules/@babel/plugin-transform-new-target": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13607,6 +13529,7 @@
},
"node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13620,6 +13543,7 @@
},
"node_modules/@babel/plugin-transform-numeric-separator": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13633,6 +13557,7 @@
},
"node_modules/@babel/plugin-transform-object-rest-spread": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-compilation-targets": "^7.28.6",
@@ -13650,6 +13575,7 @@
},
"node_modules/@babel/plugin-transform-object-super": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1",
@@ -13664,6 +13590,7 @@
},
"node_modules/@babel/plugin-transform-optional-catch-binding": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13677,6 +13604,7 @@
},
"node_modules/@babel/plugin-transform-optional-chaining": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
@@ -13691,6 +13619,7 @@
},
"node_modules/@babel/plugin-transform-parameters": {
"version": "7.27.7",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13704,6 +13633,7 @@
},
"node_modules/@babel/plugin-transform-private-methods": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-class-features-plugin": "^7.28.6",
@@ -13718,6 +13648,7 @@
},
"node_modules/@babel/plugin-transform-private-property-in-object": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
@@ -13733,6 +13664,7 @@
},
"node_modules/@babel/plugin-transform-property-literals": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13746,6 +13678,7 @@
},
"node_modules/@babel/plugin-transform-react-display-name": {
"version": "7.28.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13759,6 +13692,7 @@
},
"node_modules/@babel/plugin-transform-react-jsx": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
@@ -13774,21 +13708,9 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-react-jsx-development": {
- "version": "7.27.1",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-transform-react-jsx": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-transform-react-jsx-self": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13802,6 +13724,7 @@
},
"node_modules/@babel/plugin-transform-react-jsx-source": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13813,22 +13736,9 @@
"@babel/core": "^7.0.0-0"
}
},
- "node_modules/@babel/plugin-transform-react-pure-annotations": {
- "version": "7.27.1",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.27.1",
- "@babel/helper-plugin-utils": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/plugin-transform-regenerator": {
"version": "7.29.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6"
@@ -13842,6 +13752,7 @@
},
"node_modules/@babel/plugin-transform-regexp-modifiers": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.28.5",
@@ -13856,6 +13767,7 @@
},
"node_modules/@babel/plugin-transform-reserved-words": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13869,6 +13781,7 @@
},
"node_modules/@babel/plugin-transform-runtime": {
"version": "7.29.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-module-imports": "^7.28.6",
@@ -13887,6 +13800,7 @@
},
"node_modules/@babel/plugin-transform-runtime/node_modules/babel-plugin-polyfill-corejs3": {
"version": "0.13.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.6.5",
@@ -13898,6 +13812,7 @@
},
"node_modules/@babel/plugin-transform-shorthand-properties": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13911,6 +13826,7 @@
},
"node_modules/@babel/plugin-transform-spread": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.28.6",
@@ -13925,6 +13841,7 @@
},
"node_modules/@babel/plugin-transform-sticky-regex": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13938,6 +13855,7 @@
},
"node_modules/@babel/plugin-transform-template-literals": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13951,6 +13869,7 @@
},
"node_modules/@babel/plugin-transform-typeof-symbol": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13964,6 +13883,7 @@
},
"node_modules/@babel/plugin-transform-typescript": {
"version": "7.28.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-annotate-as-pure": "^7.27.3",
@@ -13981,6 +13901,7 @@
},
"node_modules/@babel/plugin-transform-unicode-escapes": {
"version": "7.27.1",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.27.1"
@@ -13994,6 +13915,7 @@
},
"node_modules/@babel/plugin-transform-unicode-property-regex": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.28.5",
@@ -14008,6 +13930,7 @@
},
"node_modules/@babel/plugin-transform-unicode-regex": {
"version": "7.27.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.27.1",
@@ -14022,6 +13945,7 @@
},
"node_modules/@babel/plugin-transform-unicode-sets-regex": {
"version": "7.28.6",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-create-regexp-features-plugin": "^7.28.5",
@@ -14036,6 +13960,7 @@
},
"node_modules/@babel/preset-env": {
"version": "7.29.2",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.29.0",
@@ -14118,6 +14043,7 @@
},
"node_modules/@babel/preset-modules": {
"version": "0.1.6-no-external-plugins",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-plugin-utils": "^7.0.0",
@@ -14128,24 +14054,6 @@
"@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/@babel/preset-react": {
- "version": "7.28.5",
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.27.1",
- "@babel/helper-validator-option": "^7.27.1",
- "@babel/plugin-transform-react-display-name": "^7.28.0",
- "@babel/plugin-transform-react-jsx": "^7.27.1",
- "@babel/plugin-transform-react-jsx-development": "^7.27.1",
- "@babel/plugin-transform-react-pure-annotations": "^7.27.1"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
"node_modules/@babel/runtime": {
"version": "7.29.2",
"license": "MIT",
@@ -14181,23 +14089,6 @@
"node": ">=6.9.0"
}
},
- "node_modules/@babel/traverse--for-generate-function-map": {
- "name": "@babel/traverse",
- "version": "7.29.0",
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.29.0",
- "@babel/generator": "^7.29.0",
- "@babel/helper-globals": "^7.28.0",
- "@babel/parser": "^7.29.0",
- "@babel/template": "^7.28.6",
- "@babel/types": "^7.29.0",
- "debug": "^4.3.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
"node_modules/@babel/types": {
"version": "7.29.7",
"license": "MIT",
@@ -14308,11 +14199,15 @@
},
"node_modules/@hapi/hoek": {
"version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
"devOptional": true,
"license": "BSD-3-Clause"
},
"node_modules/@hapi/topo": {
"version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
"devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -14440,6 +14335,8 @@
},
"node_modules/@isaacs/ttlcache": {
"version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/ttlcache/-/ttlcache-1.4.1.tgz",
+ "integrity": "sha512-RQgQ4uQ+pLbqXfOmieB91ejmLwvSgv9nLx6sT6sD83s7umBypgg+OIBOBbEUiJXrfpnp9j0mRhYYdzp9uqq3lA==",
"license": "ISC",
"engines": {
"node": ">=12"
@@ -14447,6 +14344,7 @@
},
"node_modules/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"camelcase": "^5.3.1",
@@ -14461,6 +14359,7 @@
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": {
"version": "4.1.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"locate-path": "^5.0.0",
@@ -14472,6 +14371,7 @@
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": {
"version": "5.0.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"p-locate": "^4.1.0"
@@ -14482,6 +14382,7 @@
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": {
"version": "2.3.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
@@ -14495,6 +14396,7 @@
},
"node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": {
"version": "4.1.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"p-limit": "^2.2.0"
@@ -14505,6 +14407,7 @@
},
"node_modules/@istanbuljs/schema": {
"version": "0.1.3",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -14574,6 +14477,7 @@
},
"node_modules/@jest/create-cache-key-function": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3"
@@ -14584,6 +14488,7 @@
},
"node_modules/@jest/environment": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@jest/fake-timers": "^29.7.0",
@@ -14620,6 +14525,7 @@
},
"node_modules/@jest/fake-timers": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
@@ -14768,6 +14674,7 @@
},
"node_modules/@jest/transform": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.11.6",
@@ -14830,6 +14737,8 @@
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.11",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.11.tgz",
+ "integrity": "sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==",
"license": "MIT",
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.5",
@@ -14848,6 +14757,19 @@
"@jridgewell/sourcemap-codec": "^1.4.14"
}
},
+ "node_modules/@mgcrea/react-native-jetpack-compose": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/@mgcrea/react-native-jetpack-compose/-/react-native-jetpack-compose-0.8.0.tgz",
+ "integrity": "sha512-DFk1TBfoYeL734onXPa5DHvoz0+PQUoVCLsE6pxWzrwHKbusIob/jZ4QF/Kx6qfegOqscSn0YXHuLayhMWhyXA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "react": ">=18.2.0",
+ "react-native": ">=0.76.0"
+ }
+ },
"node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
"version": "5.1.1-v1",
"dev": true,
@@ -14856,17 +14778,6 @@
"eslint-scope": "5.1.1"
}
},
- "node_modules/@nodable/entities": {
- "version": "2.2.0",
- "devOptional": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/nodable"
- }
- ],
- "license": "MIT"
- },
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"devOptional": true,
@@ -14909,16 +14820,18 @@
}
},
"node_modules/@react-native-community/cli": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-20.1.0.tgz",
+ "integrity": "sha512-441WsVtRe4nGJ9OzA+QMU1+22lA6Q2hRWqqIMKD0wjEMLqcSfOZyu2UL9a/yRpL/dRpyUsU4n7AxqKfTKO/Csg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-clean": "20.1.3",
- "@react-native-community/cli-config": "20.1.3",
- "@react-native-community/cli-doctor": "20.1.3",
- "@react-native-community/cli-server-api": "20.1.3",
- "@react-native-community/cli-tools": "20.1.3",
- "@react-native-community/cli-types": "20.1.3",
+ "@react-native-community/cli-clean": "20.1.0",
+ "@react-native-community/cli-config": "20.1.0",
+ "@react-native-community/cli-doctor": "20.1.0",
+ "@react-native-community/cli-server-api": "20.1.0",
+ "@react-native-community/cli-tools": "20.1.0",
+ "@react-native-community/cli-types": "20.1.0",
"commander": "^9.4.1",
"deepmerge": "^4.3.0",
"execa": "^5.0.0",
@@ -14937,22 +14850,26 @@
}
},
"node_modules/@react-native-community/cli-clean": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-20.1.0.tgz",
+ "integrity": "sha512-77L4DifWfxAT8ByHnkypge7GBMYpbJAjBGV+toowt5FQSGaTBDcBHCX+FFqFRukD5fH6i8sZ41Gtw+nbfCTTIA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-tools": "20.1.3",
+ "@react-native-community/cli-tools": "20.1.0",
"execa": "^5.0.0",
"fast-glob": "^3.3.2",
"picocolors": "^1.1.1"
}
},
"node_modules/@react-native-community/cli-config": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-20.1.0.tgz",
+ "integrity": "sha512-1x9rhLLR/dKKb92Lb5O0l0EmUG08FHf+ZVyVEf9M+tX+p5QIm52MRiy43R0UAZ2jJnFApxRk+N3sxoYK4Dtnag==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-tools": "20.1.3",
+ "@react-native-community/cli-tools": "20.1.0",
"cosmiconfig": "^9.0.0",
"deepmerge": "^4.3.0",
"fast-glob": "^3.3.2",
@@ -14961,45 +14878,43 @@
}
},
"node_modules/@react-native-community/cli-config-android": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-config-android/-/cli-config-android-20.1.0.tgz",
+ "integrity": "sha512-3A01ZDyFeCALzzPcwP/fleHoP3sGNq1UX7FzxkTrOFX8RRL9ntXNXQd27E56VU4BBxGAjAJT4Utw8pcOjJceIA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-tools": "20.1.3",
+ "@react-native-community/cli-tools": "20.1.0",
"fast-glob": "^3.3.2",
- "fast-xml-parser": "^5.3.6",
+ "fast-xml-parser": "^4.4.1",
"picocolors": "^1.1.1"
}
},
"node_modules/@react-native-community/cli-config-apple": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-config-apple/-/cli-config-apple-20.1.0.tgz",
+ "integrity": "sha512-n6JVs8Q3yxRbtZQOy05ofeb1kGtspGN3SgwPmuaqvURF9fsuS7c4/9up2Kp9C+1D2J1remPJXiZLNGOcJvfpOA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-tools": "20.1.3",
+ "@react-native-community/cli-tools": "20.1.0",
"execa": "^5.0.0",
"fast-glob": "^3.3.2",
"picocolors": "^1.1.1"
}
},
- "node_modules/@react-native-community/cli-debugger-ui": {
- "version": "16.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "serve-static": "^1.13.1"
- }
- },
"node_modules/@react-native-community/cli-doctor": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-20.1.0.tgz",
+ "integrity": "sha512-QfJF1GVjA4PBrIT3SJ0vFFIu0km1vwOmLDlOYVqfojajZJ+Dnvl0f94GN1il/jT7fITAxom///XH3/URvi7YTQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-config": "20.1.3",
- "@react-native-community/cli-platform-android": "20.1.3",
- "@react-native-community/cli-platform-apple": "20.1.3",
- "@react-native-community/cli-platform-ios": "20.1.3",
- "@react-native-community/cli-tools": "20.1.3",
+ "@react-native-community/cli-config": "20.1.0",
+ "@react-native-community/cli-platform-android": "20.1.0",
+ "@react-native-community/cli-platform-apple": "20.1.0",
+ "@react-native-community/cli-platform-ios": "20.1.0",
+ "@react-native-community/cli-tools": "20.1.0",
"command-exists": "^1.2.8",
"deepmerge": "^4.3.0",
"envinfo": "^7.13.0",
@@ -15013,7 +14928,9 @@
}
},
"node_modules/@react-native-community/cli-doctor/node_modules/semver": {
- "version": "7.7.4",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"devOptional": true,
"license": "ISC",
"bin": {
@@ -15024,44 +14941,52 @@
}
},
"node_modules/@react-native-community/cli-platform-android": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-20.1.0.tgz",
+ "integrity": "sha512-TeHPDThOwDppQRpndm9kCdRCBI8AMy3HSIQ+iy7VYQXL5BtZ5LfmGdusoj7nVN/ZGn0Lc6Gwts5qowyupXdeKg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-config-android": "20.1.3",
- "@react-native-community/cli-tools": "20.1.3",
+ "@react-native-community/cli-config-android": "20.1.0",
+ "@react-native-community/cli-tools": "20.1.0",
"execa": "^5.0.0",
"logkitty": "^0.7.1",
"picocolors": "^1.1.1"
}
},
"node_modules/@react-native-community/cli-platform-apple": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-apple/-/cli-platform-apple-20.1.0.tgz",
+ "integrity": "sha512-0ih1hrYezSM2cuOlVnwBEFtMwtd8YgpTLmZauDJCv50rIumtkI1cQoOgLoS4tbPCj9U/Vn2a9BFH0DLFOOIacg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-config-apple": "20.1.3",
- "@react-native-community/cli-tools": "20.1.3",
+ "@react-native-community/cli-config-apple": "20.1.0",
+ "@react-native-community/cli-tools": "20.1.0",
"execa": "^5.0.0",
- "fast-xml-parser": "^5.3.6",
+ "fast-xml-parser": "^4.4.1",
"picocolors": "^1.1.1"
}
},
"node_modules/@react-native-community/cli-platform-ios": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-20.1.0.tgz",
+ "integrity": "sha512-XN7Da9z4WsJxtqVtEzY8q2bv22OsvzaFP5zy5+phMWNoJlU4lf7IvBSxqGYMpQ9XhYP7arDw5vmW4W34s06rnA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-platform-apple": "20.1.3"
+ "@react-native-community/cli-platform-apple": "20.1.0"
}
},
"node_modules/@react-native-community/cli-server-api": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-20.1.0.tgz",
+ "integrity": "sha512-Tb415Oh8syXNT2zOzLzFkBXznzGaqKCiaichxKzGCDKg6JGHp3jSuCmcTcaPeYC7oc32n/S3Psw7798r4Q/7lA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "@react-native-community/cli-tools": "20.1.3",
- "body-parser": "^2.2.2",
+ "@react-native-community/cli-tools": "20.1.0",
+ "body-parser": "^1.20.3",
"compression": "^1.7.1",
"connect": "^3.6.5",
"errorhandler": "^1.5.1",
@@ -15069,12 +14994,13 @@
"open": "^6.2.0",
"pretty-format": "^29.7.0",
"serve-static": "^1.13.1",
- "strict-url-sanitise": "0.0.1",
"ws": "^6.2.3"
}
},
"node_modules/@react-native-community/cli-tools": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-20.1.0.tgz",
+ "integrity": "sha512-/YmzHGOkY6Bgrv4OaA1L8rFqsBlQd1EB2/ipAoKPiieV0EcB5PUamUSuNeFU3sBZZTYQCUENwX4wgOHgFUlDnQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -15091,7 +15017,9 @@
}
},
"node_modules/@react-native-community/cli-tools/node_modules/semver": {
- "version": "7.7.4",
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"devOptional": true,
"license": "ISC",
"bin": {
@@ -15102,7 +15030,9 @@
}
},
"node_modules/@react-native-community/cli-types": {
- "version": "20.1.3",
+ "version": "20.1.0",
+ "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-20.1.0.tgz",
+ "integrity": "sha512-D0kDspcwgbVXyNjwicT7Bb1JgXjijTw1JJd+qxyF/a9+sHv7TU4IchV+gN38QegeXqVyM4Ym7YZIvXMFBmyJqA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -15120,61 +15050,38 @@
"node": ">=10"
}
},
- "node_modules/@react-native-community/eslint-config": {
- "version": "3.2.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.14.0",
- "@babel/eslint-parser": "^7.18.2",
- "@react-native-community/eslint-plugin": "^1.1.0",
- "@typescript-eslint/eslint-plugin": "^5.30.5",
- "@typescript-eslint/parser": "^5.30.5",
- "eslint-config-prettier": "^8.5.0",
- "eslint-plugin-eslint-comments": "^3.2.0",
- "eslint-plugin-ft-flow": "^2.0.1",
- "eslint-plugin-jest": "^26.5.3",
- "eslint-plugin-prettier": "^4.2.1",
- "eslint-plugin-react": "^7.30.1",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-react-native": "^4.0.0"
- },
- "peerDependencies": {
- "eslint": ">=8",
- "prettier": ">=2"
- }
- },
- "node_modules/@react-native-community/eslint-plugin": {
- "version": "1.3.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/@react-native-community/slider": {
"resolved": "../package",
"link": true
},
"node_modules/@react-native/assets-registry": {
- "version": "0.79.7",
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/assets-registry/-/assets-registry-0.85.1.tgz",
+ "integrity": "sha512-QODQ15teXThKaKdb7lnx4RifNUGnsGZ/NMKtkNBE89nJuK93+mPsb1ozp5xkGyLw7ZNVYO4Nkqsp4MsBOuAX8g==",
"license": "MIT",
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/babel-plugin-codegen": {
- "version": "0.79.2",
- "dev": true,
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/babel-plugin-codegen/-/babel-plugin-codegen-0.85.1.tgz",
+ "integrity": "sha512-Klex4kTsRxoswZmo7EBXobvpg+HO6h7xeGo87CLXSKPq3qHlJ8ilpgtmzYCTK+Qr/0Mk3cz2zv3bA9VTXR+NDA==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.3",
- "@react-native/codegen": "0.79.2"
+ "@babel/traverse": "^7.29.0",
+ "@react-native/codegen": "0.85.1"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/babel-preset": {
- "version": "0.79.2",
- "dev": true,
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/babel-preset/-/babel-preset-0.85.1.tgz",
+ "integrity": "sha512-Mplsn13fCxQElOfWg6wIuXJP+tyO980etTQ1gQFTt5Zstj3rs33GzTLMNlo6EnT8PQghO3GxIrg/2im5GwodnA==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/core": "^7.25.2",
@@ -15183,27 +15090,19 @@
"@babel/plugin-syntax-export-default-from": "^7.24.7",
"@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
"@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-transform-arrow-functions": "^7.24.7",
"@babel/plugin-transform-async-generator-functions": "^7.25.4",
"@babel/plugin-transform-async-to-generator": "^7.24.7",
"@babel/plugin-transform-block-scoping": "^7.25.0",
"@babel/plugin-transform-class-properties": "^7.25.4",
"@babel/plugin-transform-classes": "^7.25.4",
- "@babel/plugin-transform-computed-properties": "^7.24.7",
"@babel/plugin-transform-destructuring": "^7.24.8",
"@babel/plugin-transform-flow-strip-types": "^7.25.2",
"@babel/plugin-transform-for-of": "^7.24.7",
- "@babel/plugin-transform-function-name": "^7.25.1",
- "@babel/plugin-transform-literals": "^7.25.2",
- "@babel/plugin-transform-logical-assignment-operators": "^7.24.7",
"@babel/plugin-transform-modules-commonjs": "^7.24.8",
"@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7",
"@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7",
- "@babel/plugin-transform-numeric-separator": "^7.24.7",
- "@babel/plugin-transform-object-rest-spread": "^7.24.7",
"@babel/plugin-transform-optional-catch-binding": "^7.24.7",
"@babel/plugin-transform-optional-chaining": "^7.24.8",
- "@babel/plugin-transform-parameters": "^7.24.7",
"@babel/plugin-transform-private-methods": "^7.24.7",
"@babel/plugin-transform-private-property-in-object": "^7.24.7",
"@babel/plugin-transform-react-display-name": "^7.24.7",
@@ -15212,1226 +15111,654 @@
"@babel/plugin-transform-react-jsx-source": "^7.24.7",
"@babel/plugin-transform-regenerator": "^7.24.7",
"@babel/plugin-transform-runtime": "^7.24.7",
- "@babel/plugin-transform-shorthand-properties": "^7.24.7",
- "@babel/plugin-transform-spread": "^7.24.7",
- "@babel/plugin-transform-sticky-regex": "^7.24.7",
"@babel/plugin-transform-typescript": "^7.25.2",
"@babel/plugin-transform-unicode-regex": "^7.24.7",
- "@babel/template": "^7.25.0",
- "@react-native/babel-plugin-codegen": "0.79.2",
- "babel-plugin-syntax-hermes-parser": "0.25.1",
+ "@react-native/babel-plugin-codegen": "0.85.1",
+ "babel-plugin-syntax-hermes-parser": "0.33.3",
"babel-plugin-transform-flow-enums": "^0.0.2",
"react-refresh": "^0.14.0"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
},
"peerDependencies": {
"@babel/core": "*"
}
},
"node_modules/@react-native/codegen": {
- "version": "0.79.2",
- "dev": true,
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/codegen/-/codegen-0.85.1.tgz",
+ "integrity": "sha512-Ge8F5VejnI7ng/NGObqBBovuLbItvmmZDFQ1Qwt/nBhHtk7l2tOffNMVNTta9Jt8TW0oXxVj6FG3hr6nx03JrQ==",
"license": "MIT",
"dependencies": {
- "glob": "^7.1.1",
- "hermes-parser": "0.25.1",
+ "@babel/core": "^7.25.2",
+ "@babel/parser": "^7.29.0",
+ "hermes-parser": "0.33.3",
"invariant": "^2.2.4",
"nullthrows": "^1.1.1",
+ "tinyglobby": "^0.2.15",
"yargs": "^17.6.2"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
},
"peerDependencies": {
"@babel/core": "*"
}
},
"node_modules/@react-native/community-cli-plugin": {
- "version": "0.79.7",
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/community-cli-plugin/-/community-cli-plugin-0.85.1.tgz",
+ "integrity": "sha512-vZtNEYv5qMYvbA9cTBMuZ3QkCqyJ7lDQgbxh4MpoZHZ0+62qjJpCXn9xzFM0Rm5ZG2hO8WDDxcFdI581BdASdg==",
"license": "MIT",
"dependencies": {
- "@react-native/dev-middleware": "0.79.7",
- "chalk": "^4.0.0",
- "debug": "^2.2.0",
+ "@react-native/dev-middleware": "0.85.1",
+ "debug": "^4.4.0",
"invariant": "^2.2.4",
- "metro": "^0.82.0",
- "metro-config": "^0.82.0",
- "metro-core": "^0.82.0",
+ "metro": "^0.84.0",
+ "metro-config": "^0.84.0",
+ "metro-core": "^0.84.0",
"semver": "^7.1.3"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
},
"peerDependencies": {
- "@react-native-community/cli": "*"
+ "@react-native-community/cli": "*",
+ "@react-native/metro-config": "0.85.1"
},
"peerDependenciesMeta": {
"@react-native-community/cli": {
"optional": true
+ },
+ "@react-native/metro-config": {
+ "optional": true
}
}
},
- "node_modules/@react-native/community-cli-plugin/node_modules/ci-info": {
- "version": "2.0.0",
- "license": "MIT"
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/cosmiconfig": {
- "version": "5.2.1",
- "license": "MIT",
- "dependencies": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
+ "node_modules/@react-native/community-cli-plugin/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/debug": {
- "version": "2.6.9",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
+ "node": ">=10"
}
},
- "node_modules/@react-native/community-cli-plugin/node_modules/hermes-estree": {
- "version": "0.29.1",
- "license": "MIT"
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/hermes-parser": {
- "version": "0.29.1",
- "license": "MIT",
- "dependencies": {
- "hermes-estree": "0.29.1"
+ "node_modules/@react-native/debugger-frontend": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-frontend/-/debugger-frontend-0.85.1.tgz",
+ "integrity": "sha512-GUC2ZEy+J/Goc4l243XeeY/8NdNXVXPXoRTc6Yy14OiDcy7Yk87VyrMARbp23wCbzhnrz0dnYB8rxJ+AJvMzCg==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/@react-native/community-cli-plugin/node_modules/import-fresh": {
- "version": "2.0.0",
+ "node_modules/@react-native/debugger-shell": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/debugger-shell/-/debugger-shell-0.85.1.tgz",
+ "integrity": "sha512-M/ogODh0uDFJ7xOlCc+v9nKUucUXGJwVOupl+zb3VT8tJnI2Cie/Fiv9NszAD/bzRQhJSrPZkJSAO6VW0XbWyA==",
"license": "MIT",
"dependencies": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.4.0",
+ "fb-dotslash": "0.5.8"
},
"engines": {
- "node": ">=4"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/@react-native/community-cli-plugin/node_modules/metro": {
- "version": "0.82.5",
+ "node_modules/@react-native/dev-middleware": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/dev-middleware/-/dev-middleware-0.85.1.tgz",
+ "integrity": "sha512-vJSIZP7yymZMnwOrdNjalVf8jqcAFtmi6zT3sC9MRMgJPGkDy05g8y5zgAkgTxpNtVsv+/q5pst8woYp7pgRkA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.24.7",
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.3",
- "@babel/types": "^7.25.2",
- "accepts": "^1.3.7",
- "chalk": "^4.0.0",
- "ci-info": "^2.0.0",
+ "@isaacs/ttlcache": "^1.4.1",
+ "@react-native/debugger-frontend": "0.85.1",
+ "@react-native/debugger-shell": "0.85.1",
+ "chrome-launcher": "^0.15.2",
+ "chromium-edge-launcher": "^0.3.0",
"connect": "^3.6.5",
"debug": "^4.4.0",
- "error-stack-parser": "^2.0.6",
- "flow-enums-runtime": "^0.0.6",
- "graceful-fs": "^4.2.4",
- "hermes-parser": "0.29.1",
- "image-size": "^1.0.2",
"invariant": "^2.2.4",
- "jest-worker": "^29.7.0",
- "jsc-safe-url": "^0.2.2",
- "lodash.throttle": "^4.1.1",
- "metro-babel-transformer": "0.82.5",
- "metro-cache": "0.82.5",
- "metro-cache-key": "0.82.5",
- "metro-config": "0.82.5",
- "metro-core": "0.82.5",
- "metro-file-map": "0.82.5",
- "metro-resolver": "0.82.5",
- "metro-runtime": "0.82.5",
- "metro-source-map": "0.82.5",
- "metro-symbolicate": "0.82.5",
- "metro-transform-plugins": "0.82.5",
- "metro-transform-worker": "0.82.5",
- "mime-types": "^2.1.27",
"nullthrows": "^1.1.1",
- "serialize-error": "^2.1.0",
- "source-map": "^0.5.6",
- "throat": "^5.0.0",
- "ws": "^7.5.10",
- "yargs": "^17.6.2"
- },
- "bin": {
- "metro": "src/cli.js"
+ "open": "^7.0.3",
+ "serve-static": "^1.16.2",
+ "ws": "^7.5.10"
},
"engines": {
- "node": ">=18.18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-babel-transformer": {
- "version": "0.82.5",
+ "node_modules/@react-native/dev-middleware/node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.25.2",
- "flow-enums-runtime": "^0.0.6",
- "hermes-parser": "0.29.1",
- "nullthrows": "^1.1.1"
+ "is-docker": "^2.0.0"
},
"engines": {
- "node": ">=18.18"
+ "node": ">=8"
}
},
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-cache": {
- "version": "0.82.5",
+ "node_modules/@react-native/dev-middleware/node_modules/open": {
+ "version": "7.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-7.4.2.tgz",
+ "integrity": "sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==",
"license": "MIT",
"dependencies": {
- "exponential-backoff": "^3.1.1",
- "flow-enums-runtime": "^0.0.6",
- "https-proxy-agent": "^7.0.5",
- "metro-core": "0.82.5"
+ "is-docker": "^2.0.0",
+ "is-wsl": "^2.1.1"
},
"engines": {
- "node": ">=18.18"
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-cache-key": {
- "version": "0.82.5",
+ "node_modules/@react-native/dev-middleware/node_modules/ws": {
+ "version": "7.5.11",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz",
+ "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==",
"license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
- },
"engines": {
- "node": ">=18.18"
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-config": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/eslint-config/-/eslint-config-0.85.1.tgz",
+ "integrity": "sha512-iowegGInEgNrllpsGZz6rRzLXm+3pl5ZVvVlLeCydNrtRAXygowGHgrCt/+GoTBq0NDvItSbULLR3X9nF/tlUw==",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "connect": "^3.6.5",
- "cosmiconfig": "^5.0.5",
- "flow-enums-runtime": "^0.0.6",
- "jest-validate": "^29.7.0",
- "metro": "0.82.5",
- "metro-cache": "0.82.5",
- "metro-core": "0.82.5",
- "metro-runtime": "0.82.5"
+ "@babel/core": "^7.25.2",
+ "@babel/eslint-parser": "^7.25.1",
+ "@react-native/eslint-plugin": "0.85.1",
+ "@typescript-eslint/eslint-plugin": "^8.36.0",
+ "@typescript-eslint/parser": "^8.36.0",
+ "eslint-config-prettier": "^8.5.0",
+ "eslint-plugin-eslint-comments": "^3.2.0",
+ "eslint-plugin-ft-flow": "^2.0.1",
+ "eslint-plugin-jest": "^29.0.1",
+ "eslint-plugin-react": "^7.37.5",
+ "eslint-plugin-react-hooks": "^7.0.1",
+ "eslint-plugin-react-native": "^5.0.0"
},
"engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-core": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "lodash.throttle": "^4.1.1",
- "metro-resolver": "0.82.5"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-file-map": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.0",
- "fb-watchman": "^2.0.0",
- "flow-enums-runtime": "^0.0.6",
- "graceful-fs": "^4.2.4",
- "invariant": "^2.2.4",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "nullthrows": "^1.1.1",
- "walker": "^1.0.7"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-file-map/node_modules/debug": {
- "version": "4.4.3",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-file-map/node_modules/ms": {
- "version": "2.1.3",
- "license": "MIT"
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-minify-terser": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "terser": "^5.15.0"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-resolver": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-source-map": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.3",
- "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3",
- "@babel/types": "^7.25.2",
- "flow-enums-runtime": "^0.0.6",
- "invariant": "^2.2.4",
- "metro-symbolicate": "0.82.5",
- "nullthrows": "^1.1.1",
- "ob1": "0.82.5",
- "source-map": "^0.5.6",
- "vlq": "^1.0.0"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-symbolicate": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "invariant": "^2.2.4",
- "metro-source-map": "0.82.5",
- "nullthrows": "^1.1.1",
- "source-map": "^0.5.6",
- "vlq": "^1.0.0"
- },
- "bin": {
- "metro-symbolicate": "src/index.js"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-transform-plugins": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.3",
- "flow-enums-runtime": "^0.0.6",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro-transform-worker": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/types": "^7.25.2",
- "flow-enums-runtime": "^0.0.6",
- "metro": "0.82.5",
- "metro-babel-transformer": "0.82.5",
- "metro-cache": "0.82.5",
- "metro-cache-key": "0.82.5",
- "metro-minify-terser": "0.82.5",
- "metro-source-map": "0.82.5",
- "metro-transform-plugins": "0.82.5",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro/node_modules/debug": {
- "version": "4.4.3",
- "license": "MIT",
- "dependencies": {
- "ms": "^2.1.3"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/metro/node_modules/ms": {
- "version": "2.1.3",
- "license": "MIT"
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/ms": {
- "version": "2.0.0",
- "license": "MIT"
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/ob1": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/parse-json": {
- "version": "4.0.0",
- "license": "MIT",
- "dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/resolve-from": {
- "version": "3.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/semver": {
- "version": "7.7.4",
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/source-map": {
- "version": "0.5.7",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@react-native/community-cli-plugin/node_modules/ws": {
- "version": "7.5.11",
- "license": "MIT",
- "engines": {
- "node": ">=8.3.0"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
},
"peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
- },
- "node_modules/@react-native/debugger-frontend": {
- "version": "0.79.7",
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@react-native/dev-middleware": {
- "version": "0.79.7",
- "license": "MIT",
- "dependencies": {
- "@isaacs/ttlcache": "^1.4.1",
- "@react-native/debugger-frontend": "0.79.7",
- "chrome-launcher": "^0.15.2",
- "chromium-edge-launcher": "^0.2.0",
- "connect": "^3.6.5",
- "debug": "^2.2.0",
- "invariant": "^2.2.4",
- "nullthrows": "^1.1.1",
- "open": "^7.0.3",
- "serve-static": "^1.16.2",
- "ws": "^6.2.3"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@react-native/dev-middleware/node_modules/debug": {
- "version": "2.6.9",
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/@react-native/dev-middleware/node_modules/is-wsl": {
- "version": "2.2.0",
- "license": "MIT",
- "dependencies": {
- "is-docker": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/@react-native/dev-middleware/node_modules/ms": {
- "version": "2.0.0",
- "license": "MIT"
- },
- "node_modules/@react-native/dev-middleware/node_modules/open": {
- "version": "7.4.2",
- "license": "MIT",
- "dependencies": {
- "is-docker": "^2.0.0",
- "is-wsl": "^2.1.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@react-native/eslint-config": {
- "version": "0.79.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/eslint-parser": "^7.25.1",
- "@react-native/eslint-plugin": "0.79.2",
- "@typescript-eslint/eslint-plugin": "^7.1.1",
- "@typescript-eslint/parser": "^7.1.1",
- "eslint-config-prettier": "^8.5.0",
- "eslint-plugin-eslint-comments": "^3.2.0",
- "eslint-plugin-ft-flow": "^2.0.1",
- "eslint-plugin-jest": "^27.9.0",
- "eslint-plugin-react": "^7.30.1",
- "eslint-plugin-react-hooks": "^4.6.0",
- "eslint-plugin-react-native": "^4.0.0"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "eslint": ">=8",
+ "eslint": "^8.0.0 || ^9.0.0",
"prettier": ">=2"
}
},
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/eslint-plugin": {
- "version": "7.18.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.10.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/type-utils": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
- "graphemer": "^1.4.0",
- "ignore": "^5.3.1",
- "natural-compare": "^1.4.0",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^7.0.0",
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": {
- "version": "7.18.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
- }
- },
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/parser": {
- "version": "7.18.0",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/scope-manager": {
- "version": "7.18.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/type-utils": {
- "version": "7.18.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/typescript-estree": "7.18.0",
- "@typescript-eslint/utils": "7.18.0",
- "debug": "^4.3.4",
- "ts-api-utils": "^1.3.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": {
- "version": "7.18.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/eslint-utils": "^4.4.0",
- "@typescript-eslint/scope-manager": "7.18.0",
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/typescript-estree": "7.18.0"
- },
- "engines": {
- "node": "^18.18.0 || >=20.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^8.56.0"
- }
- },
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/types": {
- "version": "7.18.0",
+ "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.62.0.tgz",
+ "integrity": "sha512-o+mpz7EYiMzXoySXiKmzlabIvTVqUuK5yLrAedRPRDA0IpPFMUV1IXt6OqljIxX/kumN6EjUYp41Hqelh6p/Dw==",
"dev": true,
"license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.12.2",
+ "@typescript-eslint/scope-manager": "8.62.0",
+ "@typescript-eslint/type-utils": "8.62.0",
+ "@typescript-eslint/utils": "8.62.0",
+ "@typescript-eslint/visitor-keys": "8.62.0",
+ "ignore": "^7.0.5",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^2.5.0"
+ },
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^8.62.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/typescript-estree": {
- "version": "7.18.0",
+ "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/parser": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.62.0.tgz",
+ "integrity": "sha512-dzHeT2gySzZtLDsuqxU9AkYgIsQoHAHtRBpOqM+Ofzx1Bwrd2RcCjQJ+6iQbsHOIR6NS33bF2W1k3blN1zLDrA==",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "@typescript-eslint/visitor-keys": "7.18.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "minimatch": "^9.0.4",
- "semver": "^7.6.0",
- "ts-api-utils": "^1.3.0"
+ "@typescript-eslint/scope-manager": "8.62.0",
+ "@typescript-eslint/types": "8.62.0",
+ "@typescript-eslint/typescript-estree": "8.62.0",
+ "@typescript-eslint/visitor-keys": "8.62.0",
+ "debug": "^4.4.3"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/visitor-keys": {
- "version": "7.18.0",
+ "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/scope-manager": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.62.0.tgz",
+ "integrity": "sha512-1lX38kNxXIRb8mEc3lbq5mdHq1Pf2+U0nFU65KfT18mtPxxl0fvjuEE92mHuXPuCtElJhOrddOpyMlM3Z0umEA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "7.18.0",
- "eslint-visitor-keys": "^3.4.3"
+ "@typescript-eslint/types": "8.62.0",
+ "@typescript-eslint/visitor-keys": "8.62.0"
},
"engines": {
- "node": "^18.18.0 || >=20.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@react-native/eslint-config/node_modules/brace-expansion": {
- "version": "2.0.3",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/@react-native/eslint-config/node_modules/eslint-plugin-jest": {
- "version": "27.9.0",
+ "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/type-utils": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.62.0.tgz",
+ "integrity": "sha512-+g5O3j0w2ldzC86Pv6fvbO/xhAonbJFIdf/MKQ1d30gndlsVzUOE83ldfSE15Qrl9fhFjK6AovHs5Wpp6vx86w==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@typescript-eslint/utils": "^5.10.0"
+ "@typescript-eslint/types": "8.62.0",
+ "@typescript-eslint/typescript-estree": "8.62.0",
+ "@typescript-eslint/utils": "8.62.0",
+ "debug": "^4.4.3",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "peerDependencies": {
- "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0",
- "eslint": "^7.0.0 || ^8.0.0",
- "jest": "*"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
- "peerDependenciesMeta": {
- "@typescript-eslint/eslint-plugin": {
- "optional": true
- },
- "jest": {
- "optional": true
- }
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@react-native/eslint-config/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
+ "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/types": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.0.tgz",
+ "integrity": "sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@react-native/eslint-config/node_modules/minimatch": {
- "version": "9.0.9",
+ "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.62.0.tgz",
+ "integrity": "sha512-+hVbNxtW64pIcZWDPGbyaKF7vp2IBTVY5ma1blwwksrjdsbdqqEKvJWMGbBofei4F6Dovx1M0RJgoFeNu2279A==",
"dev": true,
- "license": "ISC",
+ "license": "MIT",
"dependencies": {
- "brace-expansion": "^2.0.2"
+ "@typescript-eslint/project-service": "8.62.0",
+ "@typescript-eslint/tsconfig-utils": "8.62.0",
+ "@typescript-eslint/types": "8.62.0",
+ "@typescript-eslint/visitor-keys": "8.62.0",
+ "debug": "^4.4.3",
+ "minimatch": "^10.2.2",
+ "semver": "^7.7.3",
+ "tinyglobby": "^0.2.15",
+ "ts-api-utils": "^2.5.0"
},
"engines": {
- "node": ">=16 || 14 >=14.17"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@react-native/eslint-config/node_modules/semver": {
- "version": "7.7.4",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@react-native/eslint-plugin": {
- "version": "0.79.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@react-native/gradle-plugin": {
- "version": "0.79.7",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@react-native/js-polyfills": {
- "version": "0.79.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/@react-native/metro-babel-transformer": {
- "version": "0.79.2",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@react-native/babel-preset": "0.79.2",
- "hermes-parser": "0.25.1",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">=18"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "@babel/core": "*"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@react-native/metro-config": {
- "version": "0.79.2",
+ "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/utils": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.62.0.tgz",
+ "integrity": "sha512-82r66fi9zYwZ+mTq3vKgwjbZ1PVk/DJzrXFLpG6RnBbdvH8TEGVHIs9H4d2drhkOzf0syZuD/OZvvlu6GDbP4g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@react-native/js-polyfills": "0.79.2",
- "@react-native/metro-babel-transformer": "0.79.2",
- "metro-config": "^0.82.0",
- "metro-runtime": "^0.82.0"
+ "@eslint-community/eslint-utils": "^4.9.1",
+ "@typescript-eslint/scope-manager": "8.62.0",
+ "@typescript-eslint/types": "8.62.0",
+ "@typescript-eslint/typescript-estree": "8.62.0"
},
"engines": {
- "node": ">=18"
- }
- },
- "node_modules/@react-native/metro-config/node_modules/ci-info": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@react-native/metro-config/node_modules/cosmiconfig": {
- "version": "5.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/@react-native/metro-config/node_modules/hermes-estree": {
- "version": "0.29.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@react-native/metro-config/node_modules/hermes-parser": {
- "version": "0.29.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hermes-estree": "0.29.1"
- }
- },
- "node_modules/@react-native/metro-config/node_modules/import-fresh": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
},
- "engines": {
- "node": ">=4"
+ "peerDependencies": {
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.62.0.tgz",
+ "integrity": "sha512-CY3uyFSRbcQv3nnSv8S0+lDftMVz6P963PoRlxrV7ew/Md564g9ut60PYzdLM5qW4jFn93GBF+Soi90ISAN+GQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.24.7",
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.3",
- "@babel/types": "^7.25.2",
- "accepts": "^1.3.7",
- "chalk": "^4.0.0",
- "ci-info": "^2.0.0",
- "connect": "^3.6.5",
- "debug": "^4.4.0",
- "error-stack-parser": "^2.0.6",
- "flow-enums-runtime": "^0.0.6",
- "graceful-fs": "^4.2.4",
- "hermes-parser": "0.29.1",
- "image-size": "^1.0.2",
- "invariant": "^2.2.4",
- "jest-worker": "^29.7.0",
- "jsc-safe-url": "^0.2.2",
- "lodash.throttle": "^4.1.1",
- "metro-babel-transformer": "0.82.5",
- "metro-cache": "0.82.5",
- "metro-cache-key": "0.82.5",
- "metro-config": "0.82.5",
- "metro-core": "0.82.5",
- "metro-file-map": "0.82.5",
- "metro-resolver": "0.82.5",
- "metro-runtime": "0.82.5",
- "metro-source-map": "0.82.5",
- "metro-symbolicate": "0.82.5",
- "metro-transform-plugins": "0.82.5",
- "metro-transform-worker": "0.82.5",
- "mime-types": "^2.1.27",
- "nullthrows": "^1.1.1",
- "serialize-error": "^2.1.0",
- "source-map": "^0.5.6",
- "throat": "^5.0.0",
- "ws": "^7.5.10",
- "yargs": "^17.6.2"
- },
- "bin": {
- "metro": "src/cli.js"
+ "@typescript-eslint/types": "8.62.0",
+ "eslint-visitor-keys": "^5.0.0"
},
"engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/metro-config/node_modules/metro-babel-transformer": {
- "version": "0.82.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "flow-enums-runtime": "^0.0.6",
- "hermes-parser": "0.29.1",
- "nullthrows": "^1.1.1"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
- "engines": {
- "node": ">=18.18"
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-cache": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/balanced-match": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz",
+ "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "exponential-backoff": "^3.1.1",
- "flow-enums-runtime": "^0.0.6",
- "https-proxy-agent": "^7.0.5",
- "metro-core": "0.82.5"
- },
"engines": {
- "node": ">=18.18"
+ "node": "18 || 20 || >=22"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-cache-key": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/brace-expansion": {
+ "version": "5.0.6",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz",
+ "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "flow-enums-runtime": "^0.0.6"
+ "balanced-match": "^4.0.2"
},
"engines": {
- "node": ">=18.18"
+ "node": "18 || 20 || >=22"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-config": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/eslint-plugin-jest": {
+ "version": "29.15.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-29.15.2.tgz",
+ "integrity": "sha512-kEN4r9RZl1xcsb4arGq89LrcVdOUFII/JSCwtTPJyv16mDwmPrcuEQwpxqZHeINvcsd7oK5O/rhdGlxFRaZwvQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "connect": "^3.6.5",
- "cosmiconfig": "^5.0.5",
- "flow-enums-runtime": "^0.0.6",
- "jest-validate": "^29.7.0",
- "metro": "0.82.5",
- "metro-cache": "0.82.5",
- "metro-core": "0.82.5",
- "metro-runtime": "0.82.5"
+ "@typescript-eslint/utils": "^8.0.0"
},
"engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/metro-config/node_modules/metro-core": {
- "version": "0.82.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "lodash.throttle": "^4.1.1",
- "metro-resolver": "0.82.5"
+ "node": "^20.12.0 || ^22.0.0 || >=24.0.0"
},
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/@react-native/metro-config/node_modules/metro-file-map": {
- "version": "0.82.5",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^4.4.0",
- "fb-watchman": "^2.0.0",
- "flow-enums-runtime": "^0.0.6",
- "graceful-fs": "^4.2.4",
- "invariant": "^2.2.4",
- "jest-worker": "^29.7.0",
- "micromatch": "^4.0.4",
- "nullthrows": "^1.1.1",
- "walker": "^1.0.7"
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^8.0.0",
+ "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0",
+ "jest": "*",
+ "typescript": ">=4.8.4 <7.0.0"
},
- "engines": {
- "node": ">=18.18"
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-minify-terser": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/eslint-plugin-react-hooks": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz",
+ "integrity": "sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g==",
"dev": true,
"license": "MIT",
"dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "terser": "^5.15.0"
+ "@babel/core": "^7.24.4",
+ "@babel/parser": "^7.24.4",
+ "hermes-parser": "^0.25.1",
+ "zod": "^3.25.0 || ^4.0.0",
+ "zod-validation-error": "^3.5.0 || ^4.0.0"
},
"engines": {
- "node": ">=18.18"
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 || ^10.0.0"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-resolver": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/eslint-plugin-react-native": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-native/-/eslint-plugin-react-native-5.0.0.tgz",
+ "integrity": "sha512-VyWlyCC/7FC/aONibOwLkzmyKg4j9oI8fzrk9WYNs4I8/m436JuOTAFwLvEn1CVvc7La4cPfbCyspP4OYpP52Q==",
"dev": true,
"license": "MIT",
"dependencies": {
- "flow-enums-runtime": "^0.0.6"
+ "eslint-plugin-react-native-globals": "^0.1.1"
},
+ "peerDependencies": {
+ "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/@react-native/eslint-config/node_modules/eslint-visitor-keys": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz",
+ "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==",
+ "dev": true,
+ "license": "Apache-2.0",
"engines": {
- "node": ">=18.18"
+ "node": "^20.19.0 || ^22.13.0 || >=24"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-source-map": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/hermes-estree": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.25.1.tgz",
+ "integrity": "sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@react-native/eslint-config/node_modules/hermes-parser": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.25.1.tgz",
+ "integrity": "sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.25.3",
- "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3",
- "@babel/types": "^7.25.2",
- "flow-enums-runtime": "^0.0.6",
- "invariant": "^2.2.4",
- "metro-symbolicate": "0.82.5",
- "nullthrows": "^1.1.1",
- "ob1": "0.82.5",
- "source-map": "^0.5.6",
- "vlq": "^1.0.0"
- },
- "engines": {
- "node": ">=18.18"
+ "hermes-estree": "0.25.1"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-symbolicate": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/ignore": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+ "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "invariant": "^2.2.4",
- "metro-source-map": "0.82.5",
- "nullthrows": "^1.1.1",
- "source-map": "^0.5.6",
- "vlq": "^1.0.0"
- },
- "bin": {
- "metro-symbolicate": "src/index.js"
- },
"engines": {
- "node": ">=18.18"
+ "node": ">= 4"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-transform-plugins": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/minimatch": {
+ "version": "10.2.5",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz",
+ "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==",
"dev": true,
- "license": "MIT",
+ "license": "BlueOak-1.0.0",
"dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/template": "^7.25.0",
- "@babel/traverse": "^7.25.3",
- "flow-enums-runtime": "^0.0.6",
- "nullthrows": "^1.1.1"
+ "brace-expansion": "^5.0.5"
},
"engines": {
- "node": ">=18.18"
+ "node": "18 || 20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
}
},
- "node_modules/@react-native/metro-config/node_modules/metro-transform-worker": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-config/node_modules/semver": {
+ "version": "7.8.5",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz",
+ "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
"dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/generator": "^7.25.0",
- "@babel/parser": "^7.25.3",
- "@babel/types": "^7.25.2",
- "flow-enums-runtime": "^0.0.6",
- "metro": "0.82.5",
- "metro-babel-transformer": "0.82.5",
- "metro-cache": "0.82.5",
- "metro-cache-key": "0.82.5",
- "metro-minify-terser": "0.82.5",
- "metro-source-map": "0.82.5",
- "metro-transform-plugins": "0.82.5",
- "nullthrows": "^1.1.1"
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
},
"engines": {
- "node": ">=18.18"
+ "node": ">=10"
}
},
- "node_modules/@react-native/metro-config/node_modules/ob1": {
- "version": "0.82.5",
+ "node_modules/@react-native/eslint-plugin": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/eslint-plugin/-/eslint-plugin-0.85.1.tgz",
+ "integrity": "sha512-FkAq0dbkvSM5cJnSCDDR/5VrduPGN2P1ASCF6J4cTEL1vtAFUApTFpoNyIedRglfrWG85UZzD/WYj1E2y+I3hw==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
- },
"engines": {
- "node": ">=18.18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/@react-native/metro-config/node_modules/parse-json": {
- "version": "4.0.0",
- "dev": true,
+ "node_modules/@react-native/gradle-plugin": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/gradle-plugin/-/gradle-plugin-0.85.1.tgz",
+ "integrity": "sha512-KeTntbnsH/NOdzZrSE8tgep+9jEMlEfklVDtgxnjjb5nDhhBD016judwyo9bsinZnuwXxmemXnOOqOfcEawxbg==",
"license": "MIT",
- "dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
- },
"engines": {
- "node": ">=4"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/@react-native/metro-config/node_modules/resolve-from": {
- "version": "3.0.0",
- "dev": true,
+ "node_modules/@react-native/jest-preset": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/jest-preset/-/jest-preset-0.85.1.tgz",
+ "integrity": "sha512-SoD4J18a+yZXjpc/0R2Kaxh++yCEAsMuiVX/lYnIUahBv/Fz/kkaXkrU9Cw4IYtg2YbHkOBNgAeSRfEHwEu44g==",
+ "devOptional": true,
"license": "MIT",
+ "dependencies": {
+ "@jest/create-cache-key-function": "^29.7.0",
+ "@react-native/js-polyfills": "0.85.1",
+ "babel-jest": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "regenerator-runtime": "^0.13.2"
+ },
"engines": {
- "node": ">=4"
+ "node": ">= 20.19.4"
+ },
+ "peerDependencies": {
+ "react": "^19.2.3"
}
},
- "node_modules/@react-native/metro-config/node_modules/source-map": {
- "version": "0.5.7",
- "dev": true,
- "license": "BSD-3-Clause",
+ "node_modules/@react-native/js-polyfills": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/js-polyfills/-/js-polyfills-0.85.1.tgz",
+ "integrity": "sha512-VseQZAKnDbmpZThLWviDIJ0NmuSiwiHA6vc2HNJTTVqTy2mQR0+858y9kDdDBQPYe0HH8+W1mYui2i4eUWGh4g==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/@react-native/metro-config/node_modules/ws": {
- "version": "7.5.11",
- "dev": true,
+ "node_modules/@react-native/metro-babel-transformer": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/metro-babel-transformer/-/metro-babel-transformer-0.85.1.tgz",
+ "integrity": "sha512-oXAVv9GfGYxkqdf20o+gbJSw4yqaUZr7AZMZ4bJG8Nom/T9GmLu/Pd2kJo5U6NQYIndgfgU73pzRgL8H7YCIWw==",
+ "devOptional": true,
"license": "MIT",
+ "dependencies": {
+ "@babel/core": "^7.25.2",
+ "@react-native/babel-preset": "0.85.1",
+ "hermes-parser": "0.33.3",
+ "nullthrows": "^1.1.1"
+ },
"engines": {
- "node": ">=8.3.0"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
},
"peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": "^5.0.2"
+ "@babel/core": "*"
+ }
+ },
+ "node_modules/@react-native/metro-config": {
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/metro-config/-/metro-config-0.85.1.tgz",
+ "integrity": "sha512-Na0OD2YFM7rESHJ3ETuYHnXNc5TJU/fpwlLmN2/uDTM9ZDb6EaEfFKZaXGbUm2lBYyeo/FG3Ur4glu8jLWMNgQ==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "@react-native/js-polyfills": "0.85.1",
+ "@react-native/metro-babel-transformer": "0.85.1",
+ "metro-config": "^0.84.0",
+ "metro-runtime": "^0.84.0"
},
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
+ "engines": {
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/@react-native/normalize-colors": {
- "version": "0.79.7",
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/normalize-colors/-/normalize-colors-0.85.1.tgz",
+ "integrity": "sha512-w+4ZZ2PvvtC0IODEmxizYOrHmeDgdzpM7CKhtTNWoNtDWZoi7/ZY3UmNntn9poPorUy5cwFbfYiP/8rJFEsFvQ==",
"license": "MIT"
},
"node_modules/@react-native/typescript-config": {
- "version": "0.79.2",
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/typescript-config/-/typescript-config-0.85.1.tgz",
+ "integrity": "sha512-Smy8J4WRfsJU/ym5tMftaXaCK8A/KFzgRNlFdDhDwW5iEBUSaRdTjhewGLlL7czHWXc/iHLTFLBBfB9hhi3BfQ==",
"dev": true,
"license": "MIT"
},
"node_modules/@react-native/virtualized-lists": {
- "version": "0.79.7",
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/@react-native/virtualized-lists/-/virtualized-lists-0.85.1.tgz",
+ "integrity": "sha512-RLpoATkxeTaYxna5dDLIxEtoStp9UL7ryHIIOmKnE9NQW3ggR+U9DWQPXQkOfRc7/kPYba4ynKA2fIISGysVTg==",
"license": "MIT",
"dependencies": {
"invariant": "^2.2.4",
"nullthrows": "^1.1.1"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
},
"peerDependencies": {
- "@types/react": "^19.0.0",
+ "@types/react": "^19.2.0",
"react": "*",
- "react-native": "*"
+ "react-native": "0.85.1"
},
"peerDependenciesMeta": {
"@types/react": {
@@ -16441,6 +15768,8 @@
},
"node_modules/@sideway/address": {
"version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
+ "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
"devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -16449,11 +15778,15 @@
},
"node_modules/@sideway/formula": {
"version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
"devOptional": true,
"license": "BSD-3-Clause"
},
"node_modules/@sideway/pinpoint": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
"devOptional": true,
"license": "BSD-3-Clause"
},
@@ -16463,6 +15796,7 @@
},
"node_modules/@sinonjs/commons": {
"version": "3.0.1",
+ "devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
"type-detect": "4.0.8"
@@ -16470,6 +15804,7 @@
},
"node_modules/@sinonjs/fake-timers": {
"version": "10.3.0",
+ "devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
"@sinonjs/commons": "^3.0.0"
@@ -16477,6 +15812,7 @@
},
"node_modules/@types/babel__core": {
"version": "7.20.5",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.20.7",
@@ -16488,6 +15824,7 @@
},
"node_modules/@types/babel__generator": {
"version": "7.27.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.0.0"
@@ -16495,6 +15832,7 @@
},
"node_modules/@types/babel__template": {
"version": "7.4.4",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.1.0",
@@ -16503,6 +15841,7 @@
},
"node_modules/@types/babel__traverse": {
"version": "7.28.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.28.2"
@@ -16510,6 +15849,7 @@
},
"node_modules/@types/graceful-fs": {
"version": "4.1.9",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@types/node": "*"
@@ -16542,276 +15882,96 @@
"pretty-format": "^29.0.0"
}
},
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "25.5.2",
- "license": "MIT",
- "dependencies": {
- "undici-types": "~7.18.0"
- }
- },
- "node_modules/@types/react": {
- "version": "19.2.14",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "csstype": "^3.2.2"
- }
- },
- "node_modules/@types/react-test-renderer": {
- "version": "19.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/react": "*"
- }
- },
- "node_modules/@types/semver": {
- "version": "7.7.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/stack-utils": {
- "version": "2.0.3",
- "license": "MIT"
- },
- "node_modules/@types/yargs": {
- "version": "17.0.35",
- "license": "MIT",
- "dependencies": {
- "@types/yargs-parser": "*"
- }
- },
- "node_modules/@types/yargs-parser": {
- "version": "21.0.3",
- "license": "MIT"
- },
- "node_modules/@typescript-eslint/eslint-plugin": {
- "version": "5.62.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@eslint-community/regexpp": "^4.4.0",
- "@typescript-eslint/scope-manager": "5.62.0",
- "@typescript-eslint/type-utils": "5.62.0",
- "@typescript-eslint/utils": "5.62.0",
- "debug": "^4.3.4",
- "graphemer": "^1.4.0",
- "ignore": "^5.2.0",
- "natural-compare-lite": "^1.4.0",
- "semver": "^7.3.7",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "@typescript-eslint/parser": "^5.0.0",
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
- "version": "7.7.4",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@typescript-eslint/parser": {
- "version": "5.62.0",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@typescript-eslint/scope-manager": "5.62.0",
- "@typescript-eslint/types": "5.62.0",
- "@typescript-eslint/typescript-estree": "5.62.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/@typescript-eslint/scope-manager": {
- "version": "5.62.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "5.62.0",
- "@typescript-eslint/visitor-keys": "5.62.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- }
- },
- "node_modules/@typescript-eslint/type-utils": {
- "version": "5.62.0",
- "dev": true,
+ "node_modules/@types/node": {
+ "version": "25.5.2",
"license": "MIT",
"dependencies": {
- "@typescript-eslint/typescript-estree": "5.62.0",
- "@typescript-eslint/utils": "5.62.0",
- "debug": "^4.3.4",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependencies": {
- "eslint": "*"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "undici-types": "~7.18.0"
}
},
- "node_modules/@typescript-eslint/types": {
- "version": "5.62.0",
- "dev": true,
+ "node_modules/@types/react": {
+ "version": "19.2.14",
+ "devOptional": true,
"license": "MIT",
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
+ "dependencies": {
+ "csstype": "^3.2.2"
}
},
- "node_modules/@typescript-eslint/typescript-estree": {
- "version": "5.62.0",
+ "node_modules/@types/react-test-renderer": {
+ "version": "19.1.0",
"dev": true,
- "license": "BSD-2-Clause",
+ "license": "MIT",
"dependencies": {
- "@typescript-eslint/types": "5.62.0",
- "@typescript-eslint/visitor-keys": "5.62.0",
- "debug": "^4.3.4",
- "globby": "^11.1.0",
- "is-glob": "^4.0.3",
- "semver": "^7.3.7",
- "tsutils": "^3.21.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/typescript-eslint"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "@types/react": "*"
}
},
- "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
- "version": "7.7.4",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.35",
+ "license": "MIT",
+ "dependencies": {
+ "@types/yargs-parser": "*"
}
},
- "node_modules/@typescript-eslint/utils": {
- "version": "5.62.0",
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "license": "MIT"
+ },
+ "node_modules/@typescript-eslint/project-service": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.62.0.tgz",
+ "integrity": "sha512-wexnCqiTg7BOGtbLDftYpRWlmLq4xfoMd7BKFR6Y75sZS3QmRKLdN3yWLhmIYgqMmP/OXWpj3H8odkb5nGURCQ==",
"dev": true,
"license": "MIT",
"dependencies": {
- "@eslint-community/eslint-utils": "^4.2.0",
- "@types/json-schema": "^7.0.9",
- "@types/semver": "^7.3.12",
- "@typescript-eslint/scope-manager": "5.62.0",
- "@typescript-eslint/types": "5.62.0",
- "@typescript-eslint/typescript-estree": "5.62.0",
- "eslint-scope": "^5.1.1",
- "semver": "^7.3.7"
+ "@typescript-eslint/tsconfig-utils": "^8.62.0",
+ "@typescript-eslint/types": "^8.62.0",
+ "debug": "^4.4.3"
},
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
},
"peerDependencies": {
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/@typescript-eslint/utils/node_modules/semver": {
- "version": "7.7.4",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
+ "typescript": ">=4.8.4 <6.1.0"
}
},
- "node_modules/@typescript-eslint/visitor-keys": {
- "version": "5.62.0",
+ "node_modules/@typescript-eslint/project-service/node_modules/@typescript-eslint/types": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.62.0.tgz",
+ "integrity": "sha512-KvAclkktORPvM54TgLgA4z9HIV1M8zOgw9ZVNXl9f/8dLYfXYX1wkMXP7qmabpijQRV5bHJLOmoyGQbLMaUYeg==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "@typescript-eslint/types": "5.62.0",
- "eslint-visitor-keys": "^3.3.0"
- },
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/typescript-eslint"
}
},
- "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
- "version": "3.4.3",
+ "node_modules/@typescript-eslint/tsconfig-utils": {
+ "version": "8.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.62.0.tgz",
+ "integrity": "sha512-y2GAdB6ykaXUvuspbYnizQc4oDDz0Tz/Yc7iWrXf9mx8vm/L/0vLHCe0tS2boG96Zy+DivnVDQ9ZUEWoHqqx1g==",
"dev": true,
- "license": "Apache-2.0",
+ "license": "MIT",
"engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
},
"funding": {
- "url": "https://opencollective.com/eslint"
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.8.4 <6.1.0"
}
},
"node_modules/@ungap/structured-clone": {
@@ -16821,6 +15981,8 @@
},
"node_modules/@vscode/sudo-prompt": {
"version": "9.3.2",
+ "resolved": "https://registry.npmjs.org/@vscode/sudo-prompt/-/sudo-prompt-9.3.2.tgz",
+ "integrity": "sha512-gcXoCN00METUNFeQOFJ+C9xUI0DKB+0EGMVg7wbVYRHBw2Eq3fKisDZOkRdOz3kqXRKOENMfShPOmypw1/8nOw==",
"devOptional": true,
"license": "MIT"
},
@@ -16836,6 +15998,7 @@
},
"node_modules/accepts": {
"version": "1.3.8",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"mime-types": "~2.1.34",
@@ -16847,6 +16010,7 @@
},
"node_modules/accepts/node_modules/negotiator": {
"version": "0.6.3",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -16872,6 +16036,8 @@
},
"node_modules/agent-base": {
"version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.4.tgz",
+ "integrity": "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==",
"license": "MIT",
"engines": {
"node": ">= 14"
@@ -16923,6 +16089,8 @@
},
"node_modules/ansi-fragments": {
"version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-fragments/-/ansi-fragments-0.2.1.tgz",
+ "integrity": "sha512-DykbNHxuXQwUDRv5ibc2b0x7uw7wmwOGLBUd5RmaQ5z8Lhx19vwvKV+FAsM5rEA6dEcHxX+/Ad5s9eF2k2bB+w==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -16933,6 +16101,8 @@
},
"node_modules/ansi-fragments/node_modules/ansi-regex": {
"version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -16941,6 +16111,8 @@
},
"node_modules/ansi-fragments/node_modules/strip-ansi": {
"version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -16972,6 +16144,7 @@
},
"node_modules/anymatch": {
"version": "3.1.3",
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"normalize-path": "^3.0.0",
@@ -16981,24 +16154,16 @@
"node": ">= 8"
}
},
- "node_modules/anynum": {
- "version": "1.0.1",
- "devOptional": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT"
- },
"node_modules/appdirsjs": {
"version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/appdirsjs/-/appdirsjs-1.2.7.tgz",
+ "integrity": "sha512-Quji6+8kLBC3NnBeo14nPDq0+2jUs5s3/xEye+udFHumHhRk4M7aAMXp/PBJqkKYGuuyR9M/6Dq7d2AViiGmhw==",
"devOptional": true,
"license": "MIT"
},
"node_modules/argparse": {
"version": "1.0.10",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"sprintf-js": "~1.0.2"
@@ -17040,14 +16205,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/array-union": {
- "version": "2.1.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/array.prototype.findlast": {
"version": "1.2.5",
"dev": true,
@@ -17142,6 +16299,8 @@
},
"node_modules/astral-regex": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz",
+ "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -17158,6 +16317,9 @@
},
"node_modules/async-limiter": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/available-typed-arrays": {
@@ -17176,6 +16338,7 @@
},
"node_modules/babel-jest": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@jest/transform": "^29.7.0",
@@ -17195,6 +16358,7 @@
},
"node_modules/babel-plugin-istanbul": {
"version": "6.1.1",
+ "devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
"@babel/helper-plugin-utils": "^7.0.0",
@@ -17209,6 +16373,7 @@
},
"node_modules/babel-plugin-jest-hoist": {
"version": "29.6.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/template": "^7.3.3",
@@ -17220,55 +16385,9 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/babel-plugin-module-resolver": {
- "version": "5.0.3",
- "license": "MIT",
- "dependencies": {
- "find-babel-config": "^2.1.1",
- "glob": "^9.3.3",
- "pkg-up": "^3.1.0",
- "reselect": "^4.1.7",
- "resolve": "^1.22.8"
- }
- },
- "node_modules/babel-plugin-module-resolver/node_modules/brace-expansion": {
- "version": "2.0.3",
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0"
- }
- },
- "node_modules/babel-plugin-module-resolver/node_modules/glob": {
- "version": "9.3.5",
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "minimatch": "^8.0.2",
- "minipass": "^4.2.4",
- "path-scurry": "^1.6.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/babel-plugin-module-resolver/node_modules/minimatch": {
- "version": "8.0.7",
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^2.0.1"
- },
- "engines": {
- "node": ">=16 || 14 >=14.17"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/babel-plugin-polyfill-corejs2": {
"version": "0.4.17",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/compat-data": "^7.28.6",
@@ -17281,6 +16400,7 @@
},
"node_modules/babel-plugin-polyfill-corejs3": {
"version": "0.14.2",
+ "dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.6.8",
@@ -17292,6 +16412,7 @@
},
"node_modules/babel-plugin-polyfill-regenerator": {
"version": "0.6.8",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/helper-define-polyfill-provider": "^0.6.8"
@@ -17300,19 +16421,18 @@
"@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
}
},
- "node_modules/babel-plugin-react-native-web": {
- "version": "0.18.12",
- "license": "MIT"
- },
"node_modules/babel-plugin-syntax-hermes-parser": {
- "version": "0.25.1",
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-syntax-hermes-parser/-/babel-plugin-syntax-hermes-parser-0.33.3.tgz",
+ "integrity": "sha512-/Z9xYdaJ1lC0pT9do6TqCqhOSLfZ5Ot8D5za1p+feEfWYupCOfGbhhEXN9r2ZgJtDNUNRw/Z+T2CvAGKBqtqWA==",
"license": "MIT",
"dependencies": {
- "hermes-parser": "0.25.1"
+ "hermes-parser": "0.33.3"
}
},
"node_modules/babel-plugin-transform-flow-enums": {
"version": "0.0.2",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/plugin-syntax-flow": "^7.12.1"
@@ -17320,6 +16440,7 @@
},
"node_modules/babel-preset-current-node-syntax": {
"version": "1.2.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/plugin-syntax-async-generators": "^7.8.4",
@@ -17342,23 +16463,9 @@
"@babel/core": "^7.0.0 || ^8.0.0-0"
}
},
- "node_modules/babel-preset-expo": {
- "version": "9.9.0",
- "license": "MIT",
- "dependencies": {
- "@babel/plugin-proposal-decorators": "^7.12.9",
- "@babel/plugin-proposal-object-rest-spread": "^7.12.13",
- "@babel/plugin-transform-export-namespace-from": "^7.22.11",
- "@babel/plugin-transform-parameters": "^7.22.15",
- "@babel/preset-env": "^7.20.0",
- "@babel/preset-react": "^7.22.15",
- "babel-plugin-module-resolver": "^5.0.0",
- "babel-plugin-react-native-web": "~0.18.10",
- "metro-react-native-babel-preset": "0.76.8"
- }
- },
"node_modules/babel-preset-jest": {
"version": "29.6.3",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"babel-plugin-jest-hoist": "^29.6.3",
@@ -17373,6 +16480,7 @@
},
"node_modules/balanced-match": {
"version": "1.0.2",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/base64-js": {
@@ -17405,6 +16513,8 @@
},
"node_modules/bl": {
"version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -17415,6 +16525,8 @@
},
"node_modules/bl/node_modules/readable-stream": {
"version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -17428,6 +16540,8 @@
},
"node_modules/bl/node_modules/string_decoder": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
+ "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -17435,30 +16549,50 @@
}
},
"node_modules/body-parser": {
- "version": "2.2.2",
+ "version": "1.20.5",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "bytes": "^3.1.2",
- "content-type": "^1.0.5",
- "debug": "^4.4.3",
- "http-errors": "^2.0.0",
- "iconv-lite": "^0.7.0",
- "on-finished": "^2.4.1",
- "qs": "^6.14.1",
- "raw-body": "^3.0.1",
- "type-is": "^2.0.1"
+ "bytes": "~3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.15.1",
+ "raw-body": "~2.5.3",
+ "type-is": "~1.6.18",
+ "unpipe": "~1.0.0"
},
"engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
}
},
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "devOptional": true,
+ "license": "MIT"
+ },
"node_modules/brace-expansion": {
"version": "1.1.13",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"balanced-match": "^1.0.0",
@@ -17515,6 +16649,8 @@
},
"node_modules/buffer": {
"version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
"devOptional": true,
"funding": [
{
@@ -17542,6 +16678,8 @@
},
"node_modules/bytes": {
"version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -17592,33 +16730,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/caller-callsite": {
- "version": "2.0.0",
- "license": "MIT",
- "dependencies": {
- "callsites": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/caller-callsite/node_modules/callsites": {
- "version": "2.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/caller-path": {
- "version": "2.0.0",
- "license": "MIT",
- "dependencies": {
- "caller-callsite": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/callsites": {
"version": "3.1.0",
"devOptional": true,
@@ -17629,6 +16740,7 @@
},
"node_modules/camelcase": {
"version": "5.3.1",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -17676,6 +16788,8 @@
},
"node_modules/chrome-launcher": {
"version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
+ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==",
"license": "Apache-2.0",
"dependencies": {
"@types/node": "*",
@@ -17692,6 +16806,8 @@
},
"node_modules/chrome-launcher/node_modules/is-wsl": {
"version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"license": "MIT",
"dependencies": {
"is-docker": "^2.0.0"
@@ -17701,19 +16817,22 @@
}
},
"node_modules/chromium-edge-launcher": {
- "version": "0.2.0",
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/chromium-edge-launcher/-/chromium-edge-launcher-0.3.0.tgz",
+ "integrity": "sha512-p03azHlGjtyRvFEee3cyvtsRYdniSkwjkzmM/KmVnqT5d7QkkwpJBhis/zCLMYdQMVJ5tt140TBNqqrZPaWeFA==",
"license": "Apache-2.0",
"dependencies": {
"@types/node": "*",
"escape-string-regexp": "^4.0.0",
"is-wsl": "^2.2.0",
- "lighthouse-logger": "^1.0.0",
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
+ "lighthouse-logger": "^1.0.0",
+ "mkdirp": "^1.0.4"
}
},
"node_modules/chromium-edge-launcher/node_modules/is-wsl": {
"version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
"license": "MIT",
"dependencies": {
"is-docker": "^2.0.0"
@@ -17722,19 +16841,6 @@
"node": ">=8"
}
},
- "node_modules/chromium-edge-launcher/node_modules/rimraf": {
- "version": "3.0.2",
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
"node_modules/ci-info": {
"version": "3.9.0",
"funding": [
@@ -17755,6 +16861,8 @@
},
"node_modules/cli-cursor": {
"version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -17766,6 +16874,8 @@
},
"node_modules/cli-spinners": {
"version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -17789,6 +16899,8 @@
},
"node_modules/clone": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -17825,11 +16937,15 @@
},
"node_modules/colorette": {
"version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz",
+ "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==",
"devOptional": true,
"license": "MIT"
},
"node_modules/command-exists": {
"version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
+ "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
"devOptional": true,
"license": "MIT"
},
@@ -17843,6 +16959,8 @@
},
"node_modules/compressible": {
"version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -17854,6 +16972,8 @@
},
"node_modules/compression": {
"version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz",
+ "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -17871,6 +16991,8 @@
},
"node_modules/compression/node_modules/debug": {
"version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -17879,11 +17001,14 @@
},
"node_modules/compression/node_modules/ms": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"devOptional": true,
"license": "MIT"
},
"node_modules/concat-map": {
"version": "0.0.1",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/connect": {
@@ -17912,6 +17037,8 @@
},
"node_modules/content-type": {
"version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -17977,6 +17104,7 @@
},
"node_modules/core-js-compat": {
"version": "3.49.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"browserslist": "^4.28.1"
@@ -17992,7 +17120,9 @@
"license": "MIT"
},
"node_modules/cosmiconfig": {
- "version": "9.0.1",
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.2.tgz",
+ "integrity": "sha512-gtTZxTDau1wL7Y7zifc2dd8jHSK/k6BTx/2Xp/BpdlAdnlYWFVt7qhJqgwi7637yRwRQ3qL4ZidbB4I8tA5VOg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -18018,11 +17148,15 @@
},
"node_modules/cosmiconfig/node_modules/argparse": {
"version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"devOptional": true,
"license": "Python-2.0"
},
"node_modules/cosmiconfig/node_modules/js-yaml": {
"version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz",
+ "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==",
"devOptional": true,
"funding": [
{
@@ -18064,7 +17198,6 @@
},
"node_modules/cross-spawn": {
"version": "7.0.6",
- "devOptional": true,
"license": "MIT",
"dependencies": {
"path-key": "^3.1.0",
@@ -18129,7 +17262,9 @@
}
},
"node_modules/dayjs": {
- "version": "1.11.20",
+ "version": "1.11.21",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.21.tgz",
+ "integrity": "sha512-98IT+HOahAisibz/yjKbzuOBwYcjJ7BCLPzARyHiyEBmRz4fatF+KPJszEHXsGYjUG234aH/cOjW1wwTbKUZlA==",
"devOptional": true,
"license": "MIT"
},
@@ -18150,6 +17285,8 @@
},
"node_modules/decamelize": {
"version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -18184,6 +17321,8 @@
},
"node_modules/defaults": {
"version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -18225,11 +17364,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/denodeify": {
- "version": "1.2.1",
- "dev": true,
- "license": "MIT"
- },
"node_modules/depd": {
"version": "2.0.0",
"license": "MIT",
@@ -18261,17 +17395,6 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/doctrine": {
"version": "3.0.0",
"dev": true,
@@ -18333,6 +17456,8 @@
},
"node_modules/env-paths": {
"version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -18341,6 +17466,8 @@
},
"node_modules/envinfo": {
"version": "7.21.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.21.0.tgz",
+ "integrity": "sha512-Lw7I8Zp5YKHFCXL7+Dz95g4CcbMEpgvqZNNq3AmlT5XAV6CgAAk6gyAMqn2zjw08K9BHfcNuKrMiCPLByGafow==",
"devOptional": true,
"license": "MIT",
"bin": {
@@ -18352,6 +17479,7 @@
},
"node_modules/error-ex": {
"version": "1.3.4",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"is-arrayish": "^0.2.1"
@@ -18359,6 +17487,8 @@
},
"node_modules/error-stack-parser": {
"version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
"license": "MIT",
"dependencies": {
"stackframe": "^1.3.4"
@@ -18366,6 +17496,8 @@
},
"node_modules/errorhandler": {
"version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.5.2.tgz",
+ "integrity": "sha512-kNAL7hESndBCrWwS72QyV3IVOTrVmj9D062FV5BQswNL5zEdeRmz/WJFyh6Aj/plvvSOrzddkxW57HgkZcR9Fw==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -18670,49 +17802,6 @@
"eslint": "^8.1.0"
}
},
- "node_modules/eslint-plugin-jest": {
- "version": "26.9.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@typescript-eslint/utils": "^5.10.0"
- },
- "engines": {
- "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
- },
- "peerDependencies": {
- "@typescript-eslint/eslint-plugin": "^5.0.0",
- "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
- },
- "peerDependenciesMeta": {
- "@typescript-eslint/eslint-plugin": {
- "optional": true
- },
- "jest": {
- "optional": true
- }
- }
- },
- "node_modules/eslint-plugin-prettier": {
- "version": "4.2.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prettier-linter-helpers": "^1.0.0"
- },
- "engines": {
- "node": ">=12.0.0"
- },
- "peerDependencies": {
- "eslint": ">=7.28.0",
- "prettier": ">=2.0.0"
- },
- "peerDependenciesMeta": {
- "eslint-config-prettier": {
- "optional": true
- }
- }
- },
"node_modules/eslint-plugin-react": {
"version": "7.37.5",
"dev": true,
@@ -18744,28 +17833,6 @@
"eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
}
},
- "node_modules/eslint-plugin-react-hooks": {
- "version": "4.6.2",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "peerDependencies": {
- "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
- }
- },
- "node_modules/eslint-plugin-react-native": {
- "version": "4.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-plugin-react-native-globals": "^0.1.1"
- },
- "peerDependencies": {
- "eslint": "^3.17.0 || ^4 || ^5 || ^6 || ^7 || ^8"
- }
- },
"node_modules/eslint-plugin-react-native-globals": {
"version": "0.1.2",
"dev": true,
@@ -18913,6 +17980,7 @@
},
"node_modules/esprima": {
"version": "4.0.1",
+ "devOptional": true,
"license": "BSD-2-Clause",
"bin": {
"esparse": "bin/esparse.js",
@@ -18954,6 +18022,7 @@
},
"node_modules/esutils": {
"version": "2.0.3",
+ "dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.10.0"
@@ -19019,6 +18088,8 @@
},
"node_modules/exponential-backoff": {
"version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
+ "integrity": "sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==",
"license": "Apache-2.0"
},
"node_modules/fast-deep-equal": {
@@ -19026,11 +18097,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/fast-diff": {
- "version": "1.3.0",
- "dev": true,
- "license": "Apache-2.0"
- },
"node_modules/fast-glob": {
"version": "3.3.3",
"devOptional": true,
@@ -19059,6 +18125,7 @@
},
"node_modules/fast-json-stable-stringify": {
"version": "2.1.0",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/fast-levenshtein": {
@@ -19066,23 +18133,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/fast-xml-builder": {
- "version": "1.2.0",
- "devOptional": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "path-expression-matcher": "^1.5.0",
- "xml-naming": "^0.1.0"
- }
- },
"node_modules/fast-xml-parser": {
- "version": "5.9.3",
+ "version": "4.5.6",
+ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.6.tgz",
+ "integrity": "sha512-Yd4vkROfJf8AuJrDIVMVmYfULKmIJszVsMv7Vo71aocsKgFxpdlpSHXSaInvyYfgw2PRuObQSW2GFpVMUjxu9A==",
"devOptional": true,
"funding": [
{
@@ -19092,12 +18146,7 @@
],
"license": "MIT",
"dependencies": {
- "@nodable/entities": "^2.2.0",
- "fast-xml-builder": "^1.2.0",
- "is-unsafe": "^1.0.1",
- "path-expression-matcher": "^1.5.0",
- "strnum": "^2.4.1",
- "xml-naming": "^0.1.0"
+ "strnum": "^1.0.5"
},
"bin": {
"fxparser": "src/cli/cli.js"
@@ -19111,6 +18160,18 @@
"reusify": "^1.0.4"
}
},
+ "node_modules/fb-dotslash": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/fb-dotslash/-/fb-dotslash-0.5.8.tgz",
+ "integrity": "sha512-XHYLKk9J4BupDxi9bSEhkfss0m+Vr9ChTrjhf9l2iw3jB5C7BnY4GVPoMcqbrTutsKJso6yj2nAB6BI/F2oZaA==",
+ "license": "(MIT OR Apache-2.0)",
+ "bin": {
+ "dotslash": "bin/dotslash"
+ },
+ "engines": {
+ "node": ">=20"
+ }
+ },
"node_modules/fb-watchman": {
"version": "2.0.2",
"license": "Apache-2.0",
@@ -19176,13 +18237,6 @@
"node": ">= 0.8"
}
},
- "node_modules/find-babel-config": {
- "version": "2.1.2",
- "license": "MIT",
- "dependencies": {
- "json5": "^2.2.3"
- }
- },
"node_modules/find-up": {
"version": "5.0.0",
"devOptional": true,
@@ -19296,10 +18350,12 @@
},
"node_modules/fs.realpath": {
"version": "1.0.0",
+ "devOptional": true,
"license": "ISC"
},
"node_modules/fsevents": {
"version": "2.3.3",
+ "dev": true,
"license": "MIT",
"optional": true,
"os": [
@@ -19311,6 +18367,7 @@
},
"node_modules/function-bind": {
"version": "1.1.2",
+ "devOptional": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
@@ -19390,6 +18447,7 @@
},
"node_modules/get-package-type": {
"version": "0.1.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8.0.0"
@@ -19436,6 +18494,7 @@
},
"node_modules/glob": {
"version": "7.2.3",
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"fs.realpath": "^1.0.0",
@@ -19492,25 +18551,6 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/globby": {
- "version": "11.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
"node_modules/gopd": {
"version": "1.2.0",
"devOptional": true,
@@ -19601,6 +18641,7 @@
},
"node_modules/hasown": {
"version": "2.0.2",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"function-bind": "^1.1.2"
@@ -19609,15 +18650,25 @@
"node": ">= 0.4"
}
},
+ "node_modules/hermes-compiler": {
+ "version": "250829098.0.10",
+ "resolved": "https://registry.npmjs.org/hermes-compiler/-/hermes-compiler-250829098.0.10.tgz",
+ "integrity": "sha512-TcRlZ0/TlyfJqquRFAWoyElVNnkdYRi/sEp4/Qy8/GYxjg8j2cS9D4MjuaQ+qimkmLN7AmO+44IznRf06mAr0w==",
+ "license": "MIT"
+ },
"node_modules/hermes-estree": {
- "version": "0.25.1",
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.33.3.tgz",
+ "integrity": "sha512-6kzYZHCk8Fy1Uc+t3HGYyJn3OL4aeqKLTyina4UFtWl8I0kSL7OmKThaiX+Uh2f8nGw3mo4Ifxg0M5Zk3/Oeqg==",
"license": "MIT"
},
"node_modules/hermes-parser": {
- "version": "0.25.1",
+ "version": "0.33.3",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.33.3.tgz",
+ "integrity": "sha512-Yg3HgaG4CqgyowtYjX/FsnPAuZdHOqSMtnbpylbptsQ9nwwSKsy6uRWcGO5RK0EqiX12q8HvDWKgeAVajRO5DA==",
"license": "MIT",
"dependencies": {
- "hermes-estree": "0.25.1"
+ "hermes-estree": "0.33.3"
}
},
"node_modules/html-escaper": {
@@ -19652,6 +18703,8 @@
},
"node_modules/https-proxy-agent": {
"version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"license": "MIT",
"dependencies": {
"agent-base": "^7.1.2",
@@ -19670,22 +18723,22 @@
}
},
"node_modules/iconv-lite": {
- "version": "0.7.2",
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "safer-buffer": ">= 2.1.2 < 3.0.0"
+ "safer-buffer": ">= 2.1.2 < 3"
},
"engines": {
"node": ">=0.10.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
}
},
"node_modules/ieee754": {
"version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"devOptional": true,
"funding": [
{
@@ -19713,6 +18766,8 @@
},
"node_modules/image-size": {
"version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/image-size/-/image-size-1.2.1.tgz",
+ "integrity": "sha512-rH+46sQJ2dlwfjfhCyNx5thzrv+dtmBIhPHk0zgRUukHzZ/kRueTJXoYYsclBaKcSMBWuGbOFXtioLpzTb5euw==",
"license": "MIT",
"dependencies": {
"queue": "6.0.2"
@@ -19767,6 +18822,7 @@
},
"node_modules/imurmurhash": {
"version": "0.1.4",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=0.8.19"
@@ -19774,6 +18830,7 @@
},
"node_modules/inflight": {
"version": "1.0.6",
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"once": "^1.3.0",
@@ -19822,6 +18879,7 @@
},
"node_modules/is-arrayish": {
"version": "0.2.1",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/is-async-function": {
@@ -19884,6 +18942,7 @@
},
"node_modules/is-core-module": {
"version": "2.16.1",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"hasown": "^2.0.2"
@@ -19926,15 +18985,10 @@
"url": "https://github.com/sponsors/ljharb"
}
},
- "node_modules/is-directory": {
- "version": "0.3.1",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/is-docker": {
"version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
"license": "MIT",
"bin": {
"is-docker": "cli.js"
@@ -19970,6 +19024,8 @@
},
"node_modules/is-fullwidth-code-point": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -20015,6 +19071,8 @@
},
"node_modules/is-interactive": {
"version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -20173,6 +19231,8 @@
},
"node_modules/is-unicode-supported": {
"version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -20182,17 +19242,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/is-unsafe": {
- "version": "1.0.1",
- "devOptional": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT"
- },
"node_modules/is-weakmap": {
"version": "2.0.2",
"dev": true,
@@ -20235,6 +19284,8 @@
},
"node_modules/is-wsl": {
"version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
+ "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -20248,11 +19299,11 @@
},
"node_modules/isexe": {
"version": "2.0.0",
- "devOptional": true,
"license": "ISC"
},
"node_modules/istanbul-lib-coverage": {
"version": "3.2.2",
+ "devOptional": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=8"
@@ -20260,6 +19311,7 @@
},
"node_modules/istanbul-lib-instrument": {
"version": "5.2.1",
+ "devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
"@babel/core": "^7.12.3",
@@ -20526,6 +19578,7 @@
},
"node_modules/jest-environment-node": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@jest/environment": "^29.7.0",
@@ -20548,6 +19601,7 @@
},
"node_modules/jest-haste-map": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
@@ -20597,6 +19651,7 @@
},
"node_modules/jest-message-util": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@babel/code-frame": "^7.12.13",
@@ -20615,6 +19670,7 @@
},
"node_modules/jest-mock": {
"version": "29.7.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"@jest/types": "^29.6.3",
@@ -20643,6 +19699,7 @@
},
"node_modules/jest-regex-util": {
"version": "29.6.3",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
@@ -20869,6 +19926,8 @@
},
"node_modules/joi": {
"version": "17.13.4",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.4.tgz",
+ "integrity": "sha512-1RuuER6kmt8K8I3nIWvPZKi5RQCb568ZPyY4Pwjlua+yo+63ZTmIwxLZH0heBmiKN4uxjvCiarDrjaeH84xicQ==",
"devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -20885,6 +19944,7 @@
},
"node_modules/js-yaml": {
"version": "3.14.2",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"argparse": "^1.0.7",
@@ -20896,6 +19956,8 @@
},
"node_modules/jsc-safe-url": {
"version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/jsc-safe-url/-/jsc-safe-url-0.2.4.tgz",
+ "integrity": "sha512-0wM3YBWtYePOjfyXQH5MWQ8H7sdk5EXSwZvmSLKk2RboVQ2Bu239jycHDz5J/8Blf3K0Qnoy2b6xD+z10MFB+Q==",
"license": "0BSD"
},
"node_modules/jsesc": {
@@ -20913,10 +19975,6 @@
"dev": true,
"license": "MIT"
},
- "node_modules/json-parse-better-errors": {
- "version": "1.0.2",
- "license": "MIT"
- },
"node_modules/json-parse-even-better-errors": {
"version": "2.3.1",
"devOptional": true,
@@ -20982,6 +20040,8 @@
},
"node_modules/launch-editor": {
"version": "2.14.1",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.14.1.tgz",
+ "integrity": "sha512-QWBrQsMpH7gPr965dsKD/3cKWiNoTjpATQf++Xq63N6sKRGMwlVXz41O1IZTMfZQgBctD/K5Zt06+/I6pP6+HA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21010,6 +20070,8 @@
},
"node_modules/lighthouse-logger": {
"version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
+ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
"license": "Apache-2.0",
"dependencies": {
"debug": "^2.6.9",
@@ -21018,6 +20080,8 @@
},
"node_modules/lighthouse-logger/node_modules/debug": {
"version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"license": "MIT",
"dependencies": {
"ms": "2.0.0"
@@ -21025,6 +20089,8 @@
},
"node_modules/lighthouse-logger/node_modules/ms": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"license": "MIT"
},
"node_modules/lines-and-columns": {
@@ -21053,6 +20119,7 @@
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/lodash.merge": {
@@ -21062,10 +20129,14 @@
},
"node_modules/lodash.throttle": {
"version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz",
+ "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==",
"license": "MIT"
},
"node_modules/log-symbols": {
"version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21081,6 +20152,8 @@
},
"node_modules/logkitty": {
"version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz",
+ "integrity": "sha512-/3ER20CTTbahrCrpYfPn7Xavv9diBROZpoXGVZDWMw4b/X4uuUwAC0ki85tgsdMRONURyIJbcOvS94QsUBYPbQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21094,6 +20167,8 @@
},
"node_modules/logkitty/node_modules/cliui": {
"version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz",
+ "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==",
"devOptional": true,
"license": "ISC",
"dependencies": {
@@ -21104,6 +20179,8 @@
},
"node_modules/logkitty/node_modules/find-up": {
"version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21116,6 +20193,8 @@
},
"node_modules/logkitty/node_modules/locate-path": {
"version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21127,6 +20206,8 @@
},
"node_modules/logkitty/node_modules/p-limit": {
"version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21141,6 +20222,8 @@
},
"node_modules/logkitty/node_modules/p-locate": {
"version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21152,6 +20235,8 @@
},
"node_modules/logkitty/node_modules/wrap-ansi": {
"version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz",
+ "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21165,11 +20250,15 @@
},
"node_modules/logkitty/node_modules/y18n": {
"version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==",
"devOptional": true,
"license": "ISC"
},
"node_modules/logkitty/node_modules/yargs": {
"version": "15.4.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
+ "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -21191,6 +20280,8 @@
},
"node_modules/logkitty/node_modules/yargs-parser": {
"version": "18.1.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz",
+ "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==",
"devOptional": true,
"license": "ISC",
"dependencies": {
@@ -21252,6 +20343,8 @@
},
"node_modules/marky": {
"version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/marky/-/marky-1.3.0.tgz",
+ "integrity": "sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==",
"license": "Apache-2.0"
},
"node_modules/math-intrinsics": {
@@ -21263,11 +20356,13 @@
}
},
"node_modules/media-typer": {
- "version": "1.1.0",
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
"devOptional": true,
"license": "MIT",
"engines": {
- "node": ">= 0.8"
+ "node": ">= 0.6"
}
},
"node_modules/memoize-one": {
@@ -21287,469 +20382,369 @@
}
},
"node_modules/metro": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro/-/metro-0.84.4.tgz",
+ "integrity": "sha512-8ETTubqfD6ornDy2zYDvRcKnVDOXdFJsjetYDBsY4oAsb6NJkiwFR+FaMESyGppFmQUyBQA4H4sFGxzcQSGtFA==",
"license": "MIT",
"dependencies": {
- "@babel/code-frame": "^7.0.0",
- "@babel/core": "^7.20.0",
- "@babel/generator": "^7.20.0",
- "@babel/parser": "^7.20.0",
- "@babel/template": "^7.0.0",
- "@babel/traverse": "^7.20.0",
- "@babel/types": "^7.20.0",
- "accepts": "^1.3.7",
- "chalk": "^4.0.0",
+ "@babel/code-frame": "^7.29.0",
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/parser": "^7.29.0",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
+ "accepts": "^2.0.0",
"ci-info": "^2.0.0",
"connect": "^3.6.5",
- "debug": "^2.2.0",
- "denodeify": "^1.2.1",
+ "debug": "^4.4.0",
"error-stack-parser": "^2.0.6",
"flow-enums-runtime": "^0.0.6",
"graceful-fs": "^4.2.4",
- "hermes-parser": "0.23.1",
+ "hermes-parser": "0.35.0",
"image-size": "^1.0.2",
"invariant": "^2.2.4",
- "jest-worker": "^29.6.3",
+ "jest-worker": "^29.7.0",
"jsc-safe-url": "^0.2.2",
"lodash.throttle": "^4.1.1",
- "metro-babel-transformer": "0.80.12",
- "metro-cache": "0.80.12",
- "metro-cache-key": "0.80.12",
- "metro-config": "0.80.12",
- "metro-core": "0.80.12",
- "metro-file-map": "0.80.12",
- "metro-resolver": "0.80.12",
- "metro-runtime": "0.80.12",
- "metro-source-map": "0.80.12",
- "metro-symbolicate": "0.80.12",
- "metro-transform-plugins": "0.80.12",
- "metro-transform-worker": "0.80.12",
- "mime-types": "^2.1.27",
+ "metro-babel-transformer": "0.84.4",
+ "metro-cache": "0.84.4",
+ "metro-cache-key": "0.84.4",
+ "metro-config": "0.84.4",
+ "metro-core": "0.84.4",
+ "metro-file-map": "0.84.4",
+ "metro-resolver": "0.84.4",
+ "metro-runtime": "0.84.4",
+ "metro-source-map": "0.84.4",
+ "metro-symbolicate": "0.84.4",
+ "metro-transform-plugins": "0.84.4",
+ "metro-transform-worker": "0.84.4",
+ "mime-types": "^3.0.1",
"nullthrows": "^1.1.1",
"serialize-error": "^2.1.0",
"source-map": "^0.5.6",
- "strip-ansi": "^6.0.0",
"throat": "^5.0.0",
"ws": "^7.5.10",
"yargs": "^17.6.2"
},
- "bin": {
- "metro": "src/cli.js"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/metro-babel-transformer": {
- "version": "0.80.12",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.20.0",
- "flow-enums-runtime": "^0.0.6",
- "hermes-parser": "0.23.1",
- "nullthrows": "^1.1.1"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/metro-babel-transformer/node_modules/hermes-estree": {
- "version": "0.23.1",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/metro-babel-transformer/node_modules/hermes-parser": {
- "version": "0.23.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "hermes-estree": "0.23.1"
- }
- },
- "node_modules/metro-cache": {
- "version": "0.80.12",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "exponential-backoff": "^3.1.1",
- "flow-enums-runtime": "^0.0.6",
- "metro-core": "0.80.12"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/metro-cache-key": {
- "version": "0.80.12",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
+ "bin": {
+ "metro": "src/cli.js"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/metro-config": {
- "version": "0.80.12",
- "dev": true,
+ "node_modules/metro-babel-transformer": {
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-babel-transformer/-/metro-babel-transformer-0.84.4.tgz",
+ "integrity": "sha512-rvCfz8snl9h20VcvpOHxZuHP1SlAkv4HXbzw7nyyVwu6Eqo5PRerbakQ9XmUCOsRy70spJ37O+G1TK8oMzo48g==",
"license": "MIT",
"dependencies": {
- "connect": "^3.6.5",
- "cosmiconfig": "^5.0.5",
+ "@babel/core": "^7.25.2",
"flow-enums-runtime": "^0.0.6",
- "jest-validate": "^29.6.3",
- "metro": "0.80.12",
- "metro-cache": "0.80.12",
- "metro-core": "0.80.12",
- "metro-runtime": "0.80.12"
+ "hermes-parser": "0.35.0",
+ "metro-cache-key": "0.84.4",
+ "nullthrows": "^1.1.1"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/metro-config/node_modules/cosmiconfig": {
- "version": "5.2.1",
- "dev": true,
+ "node_modules/metro-babel-transformer/node_modules/hermes-estree": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz",
+ "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==",
+ "license": "MIT"
+ },
+ "node_modules/metro-babel-transformer/node_modules/hermes-parser": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz",
+ "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==",
"license": "MIT",
"dependencies": {
- "import-fresh": "^2.0.0",
- "is-directory": "^0.3.1",
- "js-yaml": "^3.13.1",
- "parse-json": "^4.0.0"
- },
- "engines": {
- "node": ">=4"
+ "hermes-estree": "0.35.0"
}
},
- "node_modules/metro-config/node_modules/import-fresh": {
- "version": "2.0.0",
- "dev": true,
+ "node_modules/metro-cache": {
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-cache/-/metro-cache-0.84.4.tgz",
+ "integrity": "sha512-gpcFQdSLUwUCk71saKoE64jLFbx2nwTfVCcPSULMNT8QYq0p1eZZE29Jvd0HtT/UlhC3ZOutLxJME5xqD2JUZg==",
"license": "MIT",
"dependencies": {
- "caller-path": "^2.0.0",
- "resolve-from": "^3.0.0"
+ "exponential-backoff": "^3.1.1",
+ "flow-enums-runtime": "^0.0.6",
+ "https-proxy-agent": "^7.0.5",
+ "metro-core": "0.84.4"
},
"engines": {
- "node": ">=4"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/metro-config/node_modules/metro-runtime": {
- "version": "0.80.12",
- "dev": true,
+ "node_modules/metro-cache-key": {
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-cache-key/-/metro-cache-key-0.84.4.tgz",
+ "integrity": "sha512-wVO79aGrkYImpnaVS4+d5RrRBRPX31QtvKB3wKGBuiNSznduZTQHzsrJZRroFJSwnygrzdsGUtDQPuqqFjFdvw==",
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.25.0",
"flow-enums-runtime": "^0.0.6"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/metro-config/node_modules/parse-json": {
- "version": "4.0.0",
- "dev": true,
+ "node_modules/metro-config": {
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-config/-/metro-config-0.84.4.tgz",
+ "integrity": "sha512-PMotGDjXcXLWo2TMRH+VR99phFNgYTwqh4OoieIKK3yTJa1Jmkl+fZJxDO0jfBvNF+WESHciHvpNuBtXaF3B0Q==",
"license": "MIT",
"dependencies": {
- "error-ex": "^1.3.1",
- "json-parse-better-errors": "^1.0.1"
+ "connect": "^3.6.5",
+ "flow-enums-runtime": "^0.0.6",
+ "jest-validate": "^29.7.0",
+ "metro": "0.84.4",
+ "metro-cache": "0.84.4",
+ "metro-core": "0.84.4",
+ "metro-runtime": "0.84.4",
+ "yaml": "^2.6.1"
},
"engines": {
- "node": ">=4"
- }
- },
- "node_modules/metro-config/node_modules/resolve-from": {
- "version": "3.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/metro-core": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.84.4.tgz",
+ "integrity": "sha512-HONpWC5LGXZn3ffkd4Hu6AIrfE7j4Z0g0wMo/goV24WOB3lhuFZ40KgvaDiSw8iyQHloMYay5N/wPX+z8oN/PQ==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6",
"lodash.throttle": "^4.1.1",
- "metro-resolver": "0.80.12"
+ "metro-resolver": "0.84.4"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/metro-file-map": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-file-map/-/metro-file-map-0.84.4.tgz",
+ "integrity": "sha512-KSVDi/u60hKPx++NLu3MTIvyjzNoJnFAF8PQFxaj1jiSka/wjw+Ua6sNuJ0TDHQv+7AAoFQxeMgaRAe8Yic5wQ==",
"license": "MIT",
"dependencies": {
- "anymatch": "^3.0.3",
- "debug": "^2.2.0",
+ "debug": "^4.4.0",
"fb-watchman": "^2.0.0",
"flow-enums-runtime": "^0.0.6",
"graceful-fs": "^4.2.4",
"invariant": "^2.2.4",
- "jest-worker": "^29.6.3",
+ "jest-worker": "^29.7.0",
"micromatch": "^4.0.4",
- "node-abort-controller": "^3.1.1",
"nullthrows": "^1.1.1",
"walker": "^1.0.7"
},
"engines": {
- "node": ">=18"
- },
- "optionalDependencies": {
- "fsevents": "^2.3.2"
- }
- },
- "node_modules/metro-file-map/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/metro-file-map/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/metro-minify-terser": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-minify-terser/-/metro-minify-terser-0.84.4.tgz",
+ "integrity": "sha512-5qpbaVOMC7CPitIpuewzVeGw7E+C3ykbv2mqTjQLl85Z3annSVGlSCTcsZjqXZzjupfK4Ztj3dDc4kc44NZwtQ==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6",
"terser": "^5.15.0"
},
"engines": {
- "node": ">=18"
- }
- },
- "node_modules/metro-react-native-babel-preset": {
- "version": "0.76.8",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.20.0",
- "@babel/plugin-proposal-async-generator-functions": "^7.0.0",
- "@babel/plugin-proposal-class-properties": "^7.18.0",
- "@babel/plugin-proposal-export-default-from": "^7.0.0",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.0",
- "@babel/plugin-proposal-numeric-separator": "^7.0.0",
- "@babel/plugin-proposal-object-rest-spread": "^7.20.0",
- "@babel/plugin-proposal-optional-catch-binding": "^7.0.0",
- "@babel/plugin-proposal-optional-chaining": "^7.20.0",
- "@babel/plugin-syntax-dynamic-import": "^7.8.0",
- "@babel/plugin-syntax-export-default-from": "^7.0.0",
- "@babel/plugin-syntax-flow": "^7.18.0",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.0.0",
- "@babel/plugin-syntax-optional-chaining": "^7.0.0",
- "@babel/plugin-transform-arrow-functions": "^7.0.0",
- "@babel/plugin-transform-async-to-generator": "^7.20.0",
- "@babel/plugin-transform-block-scoping": "^7.0.0",
- "@babel/plugin-transform-classes": "^7.0.0",
- "@babel/plugin-transform-computed-properties": "^7.0.0",
- "@babel/plugin-transform-destructuring": "^7.20.0",
- "@babel/plugin-transform-flow-strip-types": "^7.20.0",
- "@babel/plugin-transform-function-name": "^7.0.0",
- "@babel/plugin-transform-literals": "^7.0.0",
- "@babel/plugin-transform-modules-commonjs": "^7.0.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.0.0",
- "@babel/plugin-transform-parameters": "^7.0.0",
- "@babel/plugin-transform-react-display-name": "^7.0.0",
- "@babel/plugin-transform-react-jsx": "^7.0.0",
- "@babel/plugin-transform-react-jsx-self": "^7.0.0",
- "@babel/plugin-transform-react-jsx-source": "^7.0.0",
- "@babel/plugin-transform-runtime": "^7.0.0",
- "@babel/plugin-transform-shorthand-properties": "^7.0.0",
- "@babel/plugin-transform-spread": "^7.0.0",
- "@babel/plugin-transform-sticky-regex": "^7.0.0",
- "@babel/plugin-transform-typescript": "^7.5.0",
- "@babel/plugin-transform-unicode-regex": "^7.0.0",
- "@babel/template": "^7.0.0",
- "babel-plugin-transform-flow-enums": "^0.0.2",
- "react-refresh": "^0.4.0"
- },
- "engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "@babel/core": "*"
- }
- },
- "node_modules/metro-react-native-babel-preset/node_modules/react-refresh": {
- "version": "0.4.3",
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/metro-resolver": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-resolver/-/metro-resolver-0.84.4.tgz",
+ "integrity": "sha512-1qLgbxQ5ZGhhutuPot1Yp348ofDsATL2WkrHF65TobqTT9K3P9qJXw38bomk7ncp5B7OYMfWwtyBZo1lCV792A==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/metro-runtime": {
- "version": "0.82.5",
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.84.4.tgz",
+ "integrity": "sha512-Jibypds4g7AhzdRKY+kDoj51s5EXMwgyp5ddtlreDAsWefMdOx+agWqgm0H2XSZ/ueanHHVM89fnf5OJnlxa8Q==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.25.0",
"flow-enums-runtime": "^0.0.6"
},
"engines": {
- "node": ">=18.18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/metro-source-map": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.84.4.tgz",
+ "integrity": "sha512-jbWkPxIesVuo1IWkvezmMJld6iu8nD62GsrZiV6jP37AOdbo4OBq1FJ+qkOg8sV05wAHB//jAbziuW0SlJfW4g==",
"license": "MIT",
"dependencies": {
- "@babel/traverse": "^7.20.0",
- "@babel/types": "^7.20.0",
+ "@babel/traverse": "^7.29.0",
+ "@babel/types": "^7.29.0",
"flow-enums-runtime": "^0.0.6",
"invariant": "^2.2.4",
- "metro-symbolicate": "0.80.12",
+ "metro-symbolicate": "0.84.4",
"nullthrows": "^1.1.1",
- "ob1": "0.80.12",
+ "ob1": "0.84.4",
"source-map": "^0.5.6",
"vlq": "^1.0.0"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/metro-source-map/node_modules/source-map": {
"version": "0.5.7",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/metro-symbolicate": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.84.4.tgz",
+ "integrity": "sha512-OnfpacxUqGPZQ27t8qK9mFa7uqHIlVWeqRqkCbvMvreEBiamEeOn8krKtcwgP5M4cYDPwuSmCTopHMVthqG4zA==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6",
"invariant": "^2.2.4",
- "metro-source-map": "0.80.12",
+ "metro-source-map": "0.84.4",
"nullthrows": "^1.1.1",
"source-map": "^0.5.6",
- "through2": "^2.0.1",
"vlq": "^1.0.0"
},
"bin": {
"metro-symbolicate": "src/index.js"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/metro-symbolicate/node_modules/source-map": {
"version": "0.5.7",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/metro-transform-plugins": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-transform-plugins/-/metro-transform-plugins-0.84.4.tgz",
+ "integrity": "sha512-kehr6HbAecqD0/a3xLXobELdPaAmRAl8bel0qagPF4vhZtux93nS8S4eq2kgKt6J2GnQpVjSoW1PXdst04mwow==",
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.20.0",
- "@babel/generator": "^7.20.0",
- "@babel/template": "^7.0.0",
- "@babel/traverse": "^7.20.0",
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/template": "^7.28.6",
+ "@babel/traverse": "^7.29.0",
"flow-enums-runtime": "^0.0.6",
"nullthrows": "^1.1.1"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/metro-transform-worker": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/metro-transform-worker/-/metro-transform-worker-0.84.4.tgz",
+ "integrity": "sha512-W1IYMvvXTu4MxYr7d9h7CeG2vpIr3bmLLIavkPY4O1ilzDrvS8z/NEe6y+pC44Ff7raMXQgYSfdqDUwN/i39gg==",
"license": "MIT",
"dependencies": {
- "@babel/core": "^7.20.0",
- "@babel/generator": "^7.20.0",
- "@babel/parser": "^7.20.0",
- "@babel/types": "^7.20.0",
+ "@babel/core": "^7.25.2",
+ "@babel/generator": "^7.29.1",
+ "@babel/parser": "^7.29.0",
+ "@babel/types": "^7.29.0",
"flow-enums-runtime": "^0.0.6",
- "metro": "0.80.12",
- "metro-babel-transformer": "0.80.12",
- "metro-cache": "0.80.12",
- "metro-cache-key": "0.80.12",
- "metro-minify-terser": "0.80.12",
- "metro-source-map": "0.80.12",
- "metro-transform-plugins": "0.80.12",
+ "metro": "0.84.4",
+ "metro-babel-transformer": "0.84.4",
+ "metro-cache": "0.84.4",
+ "metro-cache-key": "0.84.4",
+ "metro-minify-terser": "0.84.4",
+ "metro-source-map": "0.84.4",
+ "metro-transform-plugins": "0.84.4",
"nullthrows": "^1.1.1"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
- "node_modules/metro/node_modules/ci-info": {
+ "node_modules/metro/node_modules/accepts": {
"version": "2.0.0",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/metro/node_modules/debug": {
- "version": "2.6.9",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz",
+ "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==",
"license": "MIT",
"dependencies": {
- "ms": "2.0.0"
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
}
},
+ "node_modules/metro/node_modules/ci-info": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz",
+ "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==",
+ "license": "MIT"
+ },
"node_modules/metro/node_modules/hermes-estree": {
- "version": "0.23.1",
- "dev": true,
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-estree/-/hermes-estree-0.35.0.tgz",
+ "integrity": "sha512-xVx5Opwy8Oo1I5yGpVRhCvWL/iV3M+ylksSKVNlxxD90cpDpR/AR1jLYqK8HWihm065a6UI3HeyAmYzwS8NOOg==",
"license": "MIT"
},
"node_modules/metro/node_modules/hermes-parser": {
- "version": "0.23.1",
- "dev": true,
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/hermes-parser/-/hermes-parser-0.35.0.tgz",
+ "integrity": "sha512-9JLjeHxBx8T4CAsydZR49PNZUaix+WpQJwu9p2010lu+7Kwl6D/7wYFFJxoz+aXkaaClp9Zfg6W6/zVlSJORaA==",
"license": "MIT",
"dependencies": {
- "hermes-estree": "0.23.1"
+ "hermes-estree": "0.35.0"
}
},
- "node_modules/metro/node_modules/metro-runtime": {
- "version": "0.80.12",
- "dev": true,
+ "node_modules/metro/node_modules/mime-types": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz",
+ "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==",
"license": "MIT",
"dependencies": {
- "@babel/runtime": "^7.25.0",
- "flow-enums-runtime": "^0.0.6"
+ "mime-db": "^1.54.0"
},
"engines": {
"node": ">=18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
- "node_modules/metro/node_modules/ms": {
- "version": "2.0.0",
- "dev": true,
- "license": "MIT"
+ "node_modules/metro/node_modules/negotiator": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz",
+ "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
},
"node_modules/metro/node_modules/source-map": {
"version": "0.5.7",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
@@ -21757,7 +20752,8 @@
},
"node_modules/metro/node_modules/ws": {
"version": "7.5.11",
- "dev": true,
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz",
+ "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==",
"license": "MIT",
"engines": {
"node": ">=8.3.0"
@@ -21788,6 +20784,8 @@
},
"node_modules/mime": {
"version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
"devOptional": true,
"license": "MIT",
"bin": {
@@ -21799,7 +20797,8 @@
},
"node_modules/mime-db": {
"version": "1.54.0",
- "devOptional": true,
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz",
+ "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==",
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -21807,6 +20806,7 @@
},
"node_modules/mime-types": {
"version": "2.1.35",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"mime-db": "1.52.0"
@@ -21817,6 +20817,7 @@
},
"node_modules/mime-types/node_modules/mime-db": {
"version": "1.52.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">= 0.6"
@@ -21832,6 +20833,7 @@
},
"node_modules/minimatch": {
"version": "3.1.5",
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"brace-expansion": "^1.1.7"
@@ -21840,13 +20842,6 @@
"node": "*"
}
},
- "node_modules/minipass": {
- "version": "4.2.8",
- "license": "ISC",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/mkdirp": {
"version": "1.0.4",
"license": "MIT",
@@ -21866,13 +20861,10 @@
"dev": true,
"license": "MIT"
},
- "node_modules/natural-compare-lite": {
- "version": "1.4.0",
- "dev": true,
- "license": "MIT"
- },
"node_modules/negotiator": {
"version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -21881,17 +20873,14 @@
},
"node_modules/nocache": {
"version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/nocache/-/nocache-3.0.4.tgz",
+ "integrity": "sha512-WDD0bdg9mbq6F4mRxEYcPWwfA1vxd0mrvKOyxI7Xj/atfRHVeutzuWByG//jfm4uPzp0y4Kj051EORCBSQMycw==",
"devOptional": true,
"license": "MIT",
"engines": {
"node": ">=12.0.0"
}
},
- "node_modules/node-abort-controller": {
- "version": "3.1.1",
- "dev": true,
- "license": "MIT"
- },
"node_modules/node-exports-info": {
"version": "1.6.0",
"dev": true,
@@ -21919,6 +20908,8 @@
},
"node_modules/node-stream-zip": {
"version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz",
+ "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -21940,6 +20931,7 @@
},
"node_modules/normalize-path": {
"version": "3.0.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -21961,14 +20953,15 @@
"license": "MIT"
},
"node_modules/ob1": {
- "version": "0.80.12",
- "dev": true,
+ "version": "0.84.4",
+ "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.84.4.tgz",
+ "integrity": "sha512-eJXMpz4aQHXF/YBB9ddqZDIS+ooO91hObo9FoW/xBkr54/zCwYYCDqT/O54vNo8kOkWs5Ou/y28NgdrV0edQNA==",
"license": "MIT",
"dependencies": {
"flow-enums-runtime": "^0.0.6"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
}
},
"node_modules/object-assign": {
@@ -22077,6 +21070,8 @@
},
"node_modules/on-headers": {
"version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz",
+ "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -22085,6 +21080,7 @@
},
"node_modules/once": {
"version": "1.4.0",
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"wrappy": "1"
@@ -22106,6 +21102,8 @@
},
"node_modules/open": {
"version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz",
+ "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -22133,6 +21131,8 @@
},
"node_modules/ora": {
"version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz",
+ "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -22199,6 +21199,7 @@
},
"node_modules/p-try": {
"version": "2.2.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=6"
@@ -22246,27 +21247,15 @@
},
"node_modules/path-exists": {
"version": "4.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-expression-matcher": {
- "version": "1.6.1",
"devOptional": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
"license": "MIT",
"engines": {
- "node": ">=14.0.0"
+ "node": ">=8"
}
},
"node_modules/path-is-absolute": {
"version": "1.0.1",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -22274,7 +21263,6 @@
},
"node_modules/path-key": {
"version": "3.1.1",
- "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -22282,10 +21270,12 @@
},
"node_modules/path-parse": {
"version": "1.0.7",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/path-scurry": {
"version": "1.11.1",
+ "dev": true,
"license": "BlueOak-1.0.0",
"dependencies": {
"lru-cache": "^10.2.0",
@@ -22300,23 +21290,17 @@
},
"node_modules/path-scurry/node_modules/lru-cache": {
"version": "10.4.3",
+ "dev": true,
"license": "ISC"
},
"node_modules/path-scurry/node_modules/minipass": {
"version": "7.1.3",
+ "dev": true,
"license": "BlueOak-1.0.0",
"engines": {
"node": ">=16 || 14 >=14.17"
}
},
- "node_modules/path-type": {
- "version": "4.0.0",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/picocolors": {
"version": "1.1.1",
"license": "ISC"
@@ -22333,6 +21317,7 @@
},
"node_modules/pirates": {
"version": "4.0.7",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">= 6"
@@ -22372,64 +21357,9 @@
"node": ">=8"
}
},
- "node_modules/pkg-dir/node_modules/p-limit": {
- "version": "2.3.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/pkg-dir/node_modules/p-locate": {
- "version": "4.1.0",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-up": {
- "version": "3.1.0",
- "license": "MIT",
- "dependencies": {
- "find-up": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-up/node_modules/find-up": {
- "version": "3.0.0",
- "license": "MIT",
- "dependencies": {
- "locate-path": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/locate-path": {
- "version": "3.0.0",
- "license": "MIT",
- "dependencies": {
- "p-locate": "^3.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/p-limit": {
+ "node_modules/pkg-dir/node_modules/p-limit": {
"version": "2.3.0",
+ "dev": true,
"license": "MIT",
"dependencies": {
"p-try": "^2.0.0"
@@ -22441,21 +21371,15 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/pkg-up/node_modules/p-locate": {
- "version": "3.0.0",
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "4.1.0",
+ "dev": true,
"license": "MIT",
"dependencies": {
- "p-limit": "^2.0.0"
+ "p-limit": "^2.2.0"
},
"engines": {
- "node": ">=6"
- }
- },
- "node_modules/pkg-up/node_modules/path-exists": {
- "version": "3.0.0",
- "license": "MIT",
- "engines": {
- "node": ">=4"
+ "node": ">=8"
}
},
"node_modules/possible-typed-array-names": {
@@ -22488,17 +21412,6 @@
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
- "node_modules/prettier-linter-helpers": {
- "version": "1.0.1",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-diff": "^1.1.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
"node_modules/pretty-format": {
"version": "29.7.0",
"license": "MIT",
@@ -22585,6 +21498,8 @@
},
"node_modules/qs": {
"version": "6.15.3",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz",
+ "integrity": "sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==",
"devOptional": true,
"license": "BSD-3-Clause",
"dependencies": {
@@ -22600,6 +21515,8 @@
},
"node_modules/queue": {
"version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-6.0.2.tgz",
+ "integrity": "sha512-iHZWu+q3IdFZFX36ro/lKBkSvfkztY5Y7HMiPlOUjhupPcG2JMfst2KKEpu5XndviX/3UhFbRngUPNKtgvtZiA==",
"license": "MIT",
"dependencies": {
"inherits": "~2.0.3"
@@ -22632,21 +21549,25 @@
}
},
"node_modules/raw-body": {
- "version": "3.0.2",
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
"bytes": "~3.1.2",
"http-errors": "~2.0.1",
- "iconv-lite": "~0.7.0",
+ "iconv-lite": "~0.4.24",
"unpipe": "~1.0.0"
},
"engines": {
- "node": ">= 0.10"
+ "node": ">= 0.8"
}
},
"node_modules/react": {
- "version": "19.2.4",
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react/-/react-19.2.3.tgz",
+ "integrity": "sha512-Ku/hhYbVjOQnXDZFv2+RibmLFGwFdeeKHFcOTlrt7xplBnya5OGn/hIRDsqDiSUcfORsDC7MPxwork8jBwsIWA==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -22684,57 +21605,59 @@
"license": "MIT"
},
"node_modules/react-native": {
- "version": "0.79.7",
- "license": "MIT",
- "dependencies": {
- "@jest/create-cache-key-function": "^29.7.0",
- "@react-native/assets-registry": "0.79.7",
- "@react-native/codegen": "0.79.7",
- "@react-native/community-cli-plugin": "0.79.7",
- "@react-native/gradle-plugin": "0.79.7",
- "@react-native/js-polyfills": "0.79.7",
- "@react-native/normalize-colors": "0.79.7",
- "@react-native/virtualized-lists": "0.79.7",
+ "version": "0.85.1",
+ "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.85.1.tgz",
+ "integrity": "sha512-1K2TIvu2M1C8gqkPevi/MuLan16mQvEdURiTlwHgrb6S2vvkDyik6TrkkXMlMMhz9hF5RT8wFyDUdlpGFlkpXg==",
+ "license": "MIT",
+ "dependencies": {
+ "@react-native/assets-registry": "0.85.1",
+ "@react-native/codegen": "0.85.1",
+ "@react-native/community-cli-plugin": "0.85.1",
+ "@react-native/gradle-plugin": "0.85.1",
+ "@react-native/js-polyfills": "0.85.1",
+ "@react-native/normalize-colors": "0.85.1",
+ "@react-native/virtualized-lists": "0.85.1",
"abort-controller": "^3.0.0",
"anser": "^1.4.9",
"ansi-regex": "^5.0.0",
- "babel-jest": "^29.7.0",
- "babel-plugin-syntax-hermes-parser": "0.25.1",
+ "babel-plugin-syntax-hermes-parser": "0.33.3",
"base64-js": "^1.5.1",
- "chalk": "^4.0.0",
"commander": "^12.0.0",
- "event-target-shim": "^5.0.1",
"flow-enums-runtime": "^0.0.6",
- "glob": "^7.1.1",
+ "hermes-compiler": "250829098.0.10",
"invariant": "^2.2.4",
- "jest-environment-node": "^29.7.0",
"memoize-one": "^5.0.0",
- "metro-runtime": "^0.82.0",
- "metro-source-map": "^0.82.0",
+ "metro-runtime": "^0.84.0",
+ "metro-source-map": "^0.84.0",
"nullthrows": "^1.1.1",
"pretty-format": "^29.7.0",
"promise": "^8.3.0",
- "react-devtools-core": "^6.1.1",
+ "react-devtools-core": "^6.1.5",
"react-refresh": "^0.14.0",
"regenerator-runtime": "^0.13.2",
- "scheduler": "0.25.0",
+ "scheduler": "0.27.0",
"semver": "^7.1.3",
"stacktrace-parser": "^0.1.10",
+ "tinyglobby": "^0.2.15",
"whatwg-fetch": "^3.0.0",
- "ws": "^6.2.3",
+ "ws": "^7.5.10",
"yargs": "^17.6.2"
},
"bin": {
"react-native": "cli.js"
},
"engines": {
- "node": ">=18"
+ "node": "^20.19.4 || ^22.13.0 || ^24.3.0 || >= 25.0.0"
},
"peerDependencies": {
- "@types/react": "^19.0.0",
- "react": "^19.0.0"
+ "@react-native/jest-preset": "0.85.1",
+ "@types/react": "^19.1.1",
+ "react": "^19.2.3"
},
"peerDependenciesMeta": {
+ "@react-native/jest-preset": {
+ "optional": true
+ },
"@types/react": {
"optional": true
}
@@ -22748,32 +21671,6 @@
"react-native": "*"
}
},
- "node_modules/react-native/node_modules/@react-native/codegen": {
- "version": "0.79.7",
- "license": "MIT",
- "dependencies": {
- "@babel/core": "^7.25.2",
- "@babel/parser": "^7.25.3",
- "glob": "^7.1.1",
- "hermes-parser": "0.25.1",
- "invariant": "^2.2.4",
- "nullthrows": "^1.1.1",
- "yargs": "^17.6.2"
- },
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "@babel/core": "*"
- }
- },
- "node_modules/react-native/node_modules/@react-native/js-polyfills": {
- "version": "0.79.7",
- "license": "MIT",
- "engines": {
- "node": ">=18"
- }
- },
"node_modules/react-native/node_modules/commander": {
"version": "12.1.0",
"license": "MIT",
@@ -22781,53 +21678,6 @@
"node": ">=18"
}
},
- "node_modules/react-native/node_modules/metro-source-map": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.25.3",
- "@babel/traverse--for-generate-function-map": "npm:@babel/traverse@^7.25.3",
- "@babel/types": "^7.25.2",
- "flow-enums-runtime": "^0.0.6",
- "invariant": "^2.2.4",
- "metro-symbolicate": "0.82.5",
- "nullthrows": "^1.1.1",
- "ob1": "0.82.5",
- "source-map": "^0.5.6",
- "vlq": "^1.0.0"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/react-native/node_modules/metro-symbolicate": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6",
- "invariant": "^2.2.4",
- "metro-source-map": "0.82.5",
- "nullthrows": "^1.1.1",
- "source-map": "^0.5.6",
- "vlq": "^1.0.0"
- },
- "bin": {
- "metro-symbolicate": "src/index.js"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
- "node_modules/react-native/node_modules/ob1": {
- "version": "0.82.5",
- "license": "MIT",
- "dependencies": {
- "flow-enums-runtime": "^0.0.6"
- },
- "engines": {
- "node": ">=18.18"
- }
- },
"node_modules/react-native/node_modules/semver": {
"version": "7.7.4",
"license": "ISC",
@@ -22838,11 +21688,25 @@
"node": ">=10"
}
},
- "node_modules/react-native/node_modules/source-map": {
- "version": "0.5.7",
- "license": "BSD-3-Clause",
+ "node_modules/react-native/node_modules/ws": {
+ "version": "7.5.11",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.11.tgz",
+ "integrity": "sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==",
+ "license": "MIT",
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
}
},
"node_modules/react-refresh": {
@@ -22853,15 +21717,17 @@
}
},
"node_modules/react-test-renderer": {
- "version": "19.0.0",
+ "version": "19.2.3",
+ "resolved": "https://registry.npmjs.org/react-test-renderer/-/react-test-renderer-19.2.3.tgz",
+ "integrity": "sha512-TMR1LnSFiWZMJkCgNf5ATSvAheTT2NvKIwiVwdBPHxjBI7n/JbWd4gaZ16DVd9foAXdvDz+sB5yxZTwMjPRxpw==",
"dev": true,
"license": "MIT",
"dependencies": {
- "react-is": "^19.0.0",
- "scheduler": "^0.25.0"
+ "react-is": "^19.2.3",
+ "scheduler": "^0.27.0"
},
"peerDependencies": {
- "react": "^19.0.0"
+ "react": "^19.2.3"
}
},
"node_modules/react-test-renderer/node_modules/react-is": {
@@ -22903,10 +21769,12 @@
},
"node_modules/regenerate": {
"version": "1.4.2",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/regenerate-unicode-properties": {
"version": "10.2.2",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"regenerate": "^1.4.2"
@@ -22940,6 +21808,7 @@
},
"node_modules/regexpu-core": {
"version": "6.4.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"regenerate": "^1.4.2",
@@ -22955,10 +21824,12 @@
},
"node_modules/regjsgen": {
"version": "0.8.0",
+ "devOptional": true,
"license": "MIT"
},
"node_modules/regjsparser": {
"version": "0.13.0",
+ "devOptional": true,
"license": "BSD-2-Clause",
"dependencies": {
"jsesc": "~3.1.0"
@@ -22976,15 +21847,14 @@
},
"node_modules/require-main-filename": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
"devOptional": true,
"license": "ISC"
},
- "node_modules/reselect": {
- "version": "4.1.8",
- "license": "MIT"
- },
"node_modules/resolve": {
"version": "1.22.11",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"is-core-module": "^2.16.1",
@@ -23014,6 +21884,7 @@
},
"node_modules/resolve-from": {
"version": "5.0.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -23029,6 +21900,8 @@
},
"node_modules/restore-cursor": {
"version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -23158,6 +22031,8 @@
},
"node_modules/safe-buffer": {
"version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"devOptional": true,
"funding": [
{
@@ -23213,11 +22088,15 @@
},
"node_modules/safer-buffer": {
"version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
"devOptional": true,
"license": "MIT"
},
"node_modules/scheduler": {
- "version": "0.25.0",
+ "version": "0.27.0",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+ "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
"license": "MIT"
},
"node_modules/semver": {
@@ -23286,6 +22165,8 @@
},
"node_modules/serialize-error": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-2.1.0.tgz",
+ "integrity": "sha512-ghgmKt5o4Tly5yEG/UJp8qTd0AN7Xalw4XBtDEKP655B699qMEtra1WlXeE6WIvdEG481JvRxULKsInq/iNysw==",
"license": "MIT",
"engines": {
"node": ">=0.10.0"
@@ -23313,6 +22194,8 @@
},
"node_modules/set-blocking": {
"version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==",
"devOptional": true,
"license": "ISC"
},
@@ -23365,7 +22248,6 @@
},
"node_modules/shebang-command": {
"version": "2.0.0",
- "devOptional": true,
"license": "MIT",
"dependencies": {
"shebang-regex": "^3.0.0"
@@ -23376,7 +22258,6 @@
},
"node_modules/shebang-regex": {
"version": "3.0.0",
- "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -23462,6 +22343,7 @@
},
"node_modules/signal-exit": {
"version": "3.0.7",
+ "devOptional": true,
"license": "ISC"
},
"node_modules/sisteransi": {
@@ -23471,6 +22353,7 @@
},
"node_modules/slash": {
"version": "3.0.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -23478,6 +22361,8 @@
},
"node_modules/slice-ansi": {
"version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz",
+ "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -23491,6 +22376,8 @@
},
"node_modules/slice-ansi/node_modules/ansi-styles": {
"version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -23502,6 +22389,8 @@
},
"node_modules/slice-ansi/node_modules/color-convert": {
"version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -23510,6 +22399,8 @@
},
"node_modules/slice-ansi/node_modules/color-name": {
"version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"devOptional": true,
"license": "MIT"
},
@@ -23531,10 +22422,12 @@
},
"node_modules/sprintf-js": {
"version": "1.0.3",
+ "devOptional": true,
"license": "BSD-3-Clause"
},
"node_modules/stack-utils": {
"version": "2.0.6",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"escape-string-regexp": "^2.0.0"
@@ -23545,6 +22438,7 @@
},
"node_modules/stack-utils/node_modules/escape-string-regexp": {
"version": "2.0.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=8"
@@ -23552,6 +22446,8 @@
},
"node_modules/stackframe": {
"version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
"license": "MIT"
},
"node_modules/stacktrace-parser": {
@@ -23590,11 +22486,6 @@
"node": ">= 0.4"
}
},
- "node_modules/strict-url-sanitise": {
- "version": "0.0.1",
- "devOptional": true,
- "license": "MIT"
- },
"node_modules/string_decoder": {
"version": "0.10.31",
"dev": true,
@@ -23796,7 +22687,9 @@
}
},
"node_modules/strnum": {
- "version": "2.4.1",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz",
+ "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==",
"devOptional": true,
"funding": [
{
@@ -23804,10 +22697,7 @@
"url": "https://github.com/sponsors/NaturalIntelligence"
}
],
- "license": "MIT",
- "dependencies": {
- "anynum": "^1.0.1"
- }
+ "license": "MIT"
},
"node_modules/supports-color": {
"version": "7.2.0",
@@ -23821,6 +22711,7 @@
},
"node_modules/supports-preserve-symlinks-flag": {
"version": "1.0.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">= 0.4"
@@ -23830,7 +22721,9 @@
}
},
"node_modules/terser": {
- "version": "5.46.1",
+ "version": "5.48.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.48.0.tgz",
+ "integrity": "sha512-J/9An6vs9Us6wKRriSFXBWdRZapREHqFzdNUKk0pmu804EMR6dr6winwo7e5JDxN4xahxQsuysyYFwlwj4XN/Q==",
"license": "BSD-2-Clause",
"dependencies": {
"@jridgewell/source-map": "^0.3.3",
@@ -23847,10 +22740,14 @@
},
"node_modules/terser/node_modules/commander": {
"version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"license": "MIT"
},
"node_modules/terser/node_modules/source-map-support": {
"version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
"license": "MIT",
"dependencies": {
"buffer-from": "^1.0.0",
@@ -23859,6 +22756,7 @@
},
"node_modules/test-exclude": {
"version": "6.0.0",
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"@istanbuljs/schema": "^0.1.2",
@@ -23876,6 +22774,8 @@
},
"node_modules/throat": {
"version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/throat/-/throat-5.0.0.tgz",
+ "integrity": "sha512-fcwX4mndzpLQKBS1DVYhGAcYaYt7vsHNIvQV+WXMvnow5cgjPphq5CaayLaGsjRdSCKZFNGt7/GYAuXaNOiYCA==",
"license": "MIT"
},
"node_modules/through2": {
@@ -23919,6 +22819,51 @@
"safe-buffer": "~5.1.0"
}
},
+ "node_modules/tinyglobby": {
+ "version": "0.2.17",
+ "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz",
+ "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==",
+ "license": "MIT",
+ "dependencies": {
+ "fdir": "^6.5.0",
+ "picomatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/SuperchupuDev"
+ }
+ },
+ "node_modules/tinyglobby/node_modules/fdir": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+ "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "picomatch": "^3 || ^4"
+ },
+ "peerDependenciesMeta": {
+ "picomatch": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/tinyglobby/node_modules/picomatch": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz",
+ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
"node_modules/tmpl": {
"version": "1.0.5",
"license": "BSD-3-Clause"
@@ -23941,33 +22886,16 @@
}
},
"node_modules/ts-api-utils": {
- "version": "1.4.3",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=16"
- },
- "peerDependencies": {
- "typescript": ">=4.2.0"
- }
- },
- "node_modules/tslib": {
- "version": "1.14.1",
- "dev": true,
- "license": "0BSD"
- },
- "node_modules/tsutils": {
- "version": "3.21.0",
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz",
+ "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==",
"dev": true,
"license": "MIT",
- "dependencies": {
- "tslib": "^1.8.1"
- },
"engines": {
- "node": ">= 6"
+ "node": ">=18.12"
},
"peerDependencies": {
- "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ "typescript": ">=4.8.4"
}
},
"node_modules/type-check": {
@@ -23983,6 +22911,7 @@
},
"node_modules/type-detect": {
"version": "4.0.8",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=4"
@@ -24000,33 +22929,19 @@
}
},
"node_modules/type-is": {
- "version": "2.0.1",
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
"devOptional": true,
"license": "MIT",
"dependencies": {
- "content-type": "^1.0.5",
- "media-typer": "^1.1.0",
- "mime-types": "^3.0.0"
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
},
"engines": {
"node": ">= 0.6"
}
},
- "node_modules/type-is/node_modules/mime-types": {
- "version": "3.0.2",
- "devOptional": true,
- "license": "MIT",
- "dependencies": {
- "mime-db": "^1.54.0"
- },
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/express"
- }
- },
"node_modules/typed-array-buffer": {
"version": "1.0.3",
"dev": true,
@@ -24098,7 +23013,9 @@
}
},
"node_modules/typescript": {
- "version": "5.0.4",
+ "version": "5.9.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -24106,7 +23023,7 @@
"tsserver": "bin/tsserver"
},
"engines": {
- "node": ">=12.20"
+ "node": ">=14.17"
}
},
"node_modules/unbox-primitive": {
@@ -24132,6 +23049,7 @@
},
"node_modules/unicode-canonical-property-names-ecmascript": {
"version": "2.0.1",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=4"
@@ -24139,6 +23057,7 @@
},
"node_modules/unicode-match-property-ecmascript": {
"version": "2.0.0",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"unicode-canonical-property-names-ecmascript": "^2.0.0",
@@ -24150,6 +23069,7 @@
},
"node_modules/unicode-match-property-value-ecmascript": {
"version": "2.2.1",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=4"
@@ -24157,6 +23077,7 @@
},
"node_modules/unicode-property-aliases-ecmascript": {
"version": "2.2.0",
+ "devOptional": true,
"license": "MIT",
"engines": {
"node": ">=4"
@@ -24248,6 +23169,8 @@
},
"node_modules/vary": {
"version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
"devOptional": true,
"license": "MIT",
"engines": {
@@ -24256,6 +23179,8 @@
},
"node_modules/vlq": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-1.0.1.tgz",
+ "integrity": "sha512-gQpnTgkubC6hQgdIcRdYGDSDc+SaujOdyesZQMv6JlfQee/9Mp0Qhnys6WxDWvQnL5WZdT7o2Ul187aSt0Rq+w==",
"license": "MIT"
},
"node_modules/walker": {
@@ -24267,6 +23192,8 @@
},
"node_modules/wcwidth": {
"version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
"devOptional": true,
"license": "MIT",
"dependencies": {
@@ -24279,7 +23206,6 @@
},
"node_modules/which": {
"version": "2.0.2",
- "devOptional": true,
"license": "ISC",
"dependencies": {
"isexe": "^2.0.0"
@@ -24359,6 +23285,8 @@
},
"node_modules/which-module": {
"version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==",
"devOptional": true,
"license": "ISC"
},
@@ -24424,10 +23352,12 @@
},
"node_modules/wrappy": {
"version": "1.0.2",
+ "devOptional": true,
"license": "ISC"
},
"node_modules/write-file-atomic": {
"version": "4.0.2",
+ "devOptional": true,
"license": "ISC",
"dependencies": {
"imurmurhash": "^0.1.4",
@@ -24439,25 +23369,14 @@
},
"node_modules/ws": {
"version": "6.2.4",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.4.tgz",
+ "integrity": "sha512-PNIUUyLI5YpkJZj60YBzX1o0ByQ4ovvfmq9N/Kig/PAYbVlGyz4R6G0SEWrD0O9acc0sT2+IdMBVLFv8FSi0Nw==",
+ "devOptional": true,
"license": "MIT",
"dependencies": {
"async-limiter": "~1.0.0"
}
},
- "node_modules/xml-naming": {
- "version": "0.1.0",
- "devOptional": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/NaturalIntelligence"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=16.0.0"
- }
- },
"node_modules/xtend": {
"version": "4.0.2",
"dev": true,
@@ -24478,8 +23397,9 @@
"license": "ISC"
},
"node_modules/yaml": {
- "version": "2.8.3",
- "devOptional": true,
+ "version": "2.9.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz",
+ "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==",
"license": "ISC",
"bin": {
"yaml": "bin.mjs"
@@ -24524,6 +23444,29 @@
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
+ },
+ "node_modules/zod": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-4.4.3.tgz",
+ "integrity": "sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ },
+ "node_modules/zod-validation-error": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/zod-validation-error/-/zod-validation-error-4.0.2.tgz",
+ "integrity": "sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "zod": "^3.25.0 || ^4.0.0"
+ }
}
}
}
diff --git a/example/package.json b/example/package.json
index 79df619a..70a8acb5 100644
--- a/example/package.json
+++ b/example/package.json
@@ -1,5 +1,5 @@
{
- "name": "example",
+ "name": "slider-example",
"version": "0.0.1",
"private": true,
"scripts": {
@@ -15,48 +15,42 @@
"clean-ios": "rm -rf ios/build/generated/ios && rm -rf ios/Pods && rm ios/Podfile.lock"
},
"dependencies": {
+ "@mgcrea/react-native-jetpack-compose": "^0.8.0",
"@react-native-community/slider": "file:../package",
- "babel-preset-expo": "^9.2.0",
- "react": "^19.0.0",
- "react-native": "^0.79.2",
- "react-native-pager-view": "^6.6.0"
+ "react": "19.2.3",
+ "react-native": "0.85.1",
+ "react-native-pager-view": "^6.9.1"
},
"devDependencies": {
"@babel/core": "^7.25.2",
"@babel/preset-env": "^7.25.3",
"@babel/runtime": "^7.25.0",
- "@react-native-community/cli": "^20.0.2",
- "@react-native-community/cli-debugger-ui": "^16.0.0",
- "@react-native-community/cli-platform-android": "^20.0.2",
- "@react-native-community/cli-platform-ios": "^20.0.2",
- "@react-native-community/eslint-config": "^3.2.0",
- "@react-native/babel-preset": "0.79.2",
- "@react-native/eslint-config": "0.79.2",
- "@react-native/metro-config": "0.79.2",
- "@react-native/typescript-config": "0.79.2",
+ "@react-native-community/cli": "20.1.0",
+ "@react-native-community/cli-platform-android": "20.1.0",
+ "@react-native-community/cli-platform-ios": "20.1.0",
+ "@react-native/babel-preset": "0.85.1",
+ "@react-native/eslint-config": "0.85.1",
+ "@react-native/jest-preset": "0.85.1",
+ "@react-native/metro-config": "0.85.1",
+ "@react-native/typescript-config": "0.85.1",
"@types/jest": "^29.5.13",
- "@types/react": "^19.0.0",
- "@types/react-test-renderer": "^19.0.0",
- "@typescript-eslint/eslint-plugin": "^5.36.2",
- "@typescript-eslint/parser": "^5.36.2",
- "babel-jest": "^29.6.3",
+ "@types/react": "^19.2.0",
+ "@types/react-test-renderer": "^19.1.0",
"copyfiles": "^2.4.1",
"eslint": "^8.19.0",
- "eslint-plugin-prettier": "4.2.1",
"jest": "^29.6.3",
- "metro-config": "^0.80.7",
"prettier": "2.8.8",
- "react-test-renderer": "19.0.0",
+ "react-test-renderer": "19.2.3",
"rimraf": "^5.0.5",
- "typescript": "5.0.4"
+ "typescript": "^5.8.3"
},
"engines": {
- "node": ">=18"
+ "node": ">= 22.11.0"
},
"react-native-windows": {
"init-windows": {
- "name": "example",
- "namespace": "example",
+ "name": "SliderExample",
+ "namespace": "SliderExample",
"template": "old/uwp-cpp-app"
}
}
diff --git a/example/src/App.tsx b/example/src/App.tsx
index 0ff0fec4..516cea5e 100644
--- a/example/src/App.tsx
+++ b/example/src/App.tsx
@@ -1,38 +1,49 @@
-import React, {useState} from 'react';
+import React, {useRef, useState} from "react";
import {
+ Image,
Platform,
+ Pressable,
SafeAreaView,
ScrollView,
StyleSheet,
+ StatusBar,
Text,
View,
-} from 'react-native';
-import {examples, Props as ExamplesTabProperties} from './Examples';
-import {propsExamples, Props as PropsTabProperties} from './Props';
-import PagerView from 'react-native-pager-view';
-import Slider from '@react-native-community/slider';
+} from "react-native";
+import PagerView from "react-native-pager-view";
+import Slider from "@react-native-community/slider";
+
+import {examples, type Props as ExamplesTabProperties} from "./Examples";
+import {propsExamples, type Props as PropsTabProperties} from "./Props";
const App = () => {
const [currentPage, setCurrentPage] = useState(0);
- const titles = ['Examples', 'Props'];
+ const pagerViewReference = useRef>(null);
+ const titles = ["Examples", "Props"];
+
+ const setPage = (page: number) => {
+ pagerViewReference.current?.setPage(page);
+ setCurrentPage(page);
+ };
const renderExampleTab = (
sliders: PropsTabProperties[] | ExamplesTabProperties[],
filtered?: boolean,
) => {
+ const tabSliders = filtered
+ ? (sliders as ExamplesTabProperties[]).filter(
+ e => !e.platform || e.platform === Platform.OS,
+ )
+ : sliders;
+
return (
-
+
- {(filtered
- ? (sliders as ExamplesTabProperties[]).filter(
- e => !e.platform || e.platform === Platform.OS,
- )
- : sliders
- ).map((e, i) => (
-
- {e.title}
+ {tabSliders.map((e, i) => (
+
+ {e.title}
{e.render()}
))}
@@ -43,30 +54,60 @@ const App = () => {
return (
-
+
+
+
+
+
+ Callstack
+ React Native Slider
+
+
+
+ {titles.map((title, index) => {
+ const isActive = index === currentPage;
+ return (
+ setPage(index)}
+ style={[styles.tab, isActive && styles.activeTab]}>
+
+ {title}
+
+
+ );
+ })}
+
-
+
{titles[currentPage]}
{
setCurrentPage(e.nativeEvent.position);
}}>
{renderExampleTab(examples, true)}
- {renderExampleTab(propsExamples)}
+ {renderExampleTab(propsExamples, true)}
);
@@ -74,46 +115,135 @@ const App = () => {
export default App;
-const pageViewPositionSlider = {
- trackColor: '#ABABAB',
- thumbColor: '#1411AB',
- style: {
- width: '100%',
- },
+const colors = {
+ accent: "#7C5CFF",
+ border: "#D9DEEA",
+ card: "#FFFFFF",
+ ink: "#201A3D",
+ muted: "#6A7284",
+ page: "#F3F5FA",
+ surface: "#2B2357",
+ track: "#51486F",
};
const styles = StyleSheet.create({
- slider: {
- width: '100%',
- },
pagerViewContainer: {
flex: 1,
+ backgroundColor: colors.page,
},
homeScreenContainer: {
flex: 1,
+ backgroundColor: colors.ink,
+ },
+ header: {
+ backgroundColor: colors.ink,
+ paddingHorizontal: 20,
+ paddingTop: Platform.select({ios: 8, default: 18}),
+ paddingBottom: 18,
+ },
+ brandRow: {
+ alignItems: "center",
+ flexDirection: "row",
+ gap: 14,
+ marginBottom: 22,
+ },
+ brandMark: {
+ width: 52,
+ height: 52,
+ borderRadius: 16,
+ resizeMode: "cover",
+ },
+ brandCopy: {
+ flex: 1,
+ },
+ eyebrow: {
+ color: "#B9B2DF",
+ fontSize: 12,
+ fontWeight: "700",
+ letterSpacing: 0,
+ marginBottom: 2,
+ textTransform: "uppercase",
+ },
+ appTitle: {
+ color: colors.card,
+ fontSize: 28,
+ fontWeight: "800",
+ letterSpacing: 0,
+ },
+ tabBar: {
+ flexDirection: "row",
+ backgroundColor: "#332A61",
+ borderRadius: 8,
+ padding: 4,
+ },
+ tab: {
+ alignItems: "center",
+ borderRadius: 6,
+ flex: 1,
+ minHeight: 40,
+ justifyContent: "center",
+ },
+ activeTab: {
+ backgroundColor: colors.card,
+ },
+ tabText: {
+ color: "#D9D4F4",
+ fontSize: 14,
+ fontWeight: "700",
+ },
+ activeTabText: {
+ color: colors.ink,
+ },
+ pageIndicator: {
+ height: 32,
+ marginHorizontal: -4,
+ marginTop: 12,
+ },
+ sectionTitle: {
+ color: colors.card,
+ fontSize: 18,
+ fontWeight: "700",
+ marginTop: 2,
+ },
+ page: {
+ flex: 1,
+ backgroundColor: colors.page,
},
scrollView: {
- backgroundColor: '#F5FCFF',
+ backgroundColor: colors.page,
},
container: {
- justifyContent: 'center',
- alignItems: 'center',
- paddingVertical: 20,
- },
- title: {
- fontSize: 30,
- color: pageViewPositionSlider.thumbColor,
- textAlign: 'center',
- width: '100%',
- marginVertical: 20,
- },
- instructions: {
- textAlign: 'center',
- color: '#333333',
- marginBottom: 5,
- fontSize: 20,
- },
- sliderWidget: {
- marginVertical: 30,
+ alignItems: "center",
+ paddingHorizontal: 20,
+ paddingTop: 18,
+ paddingBottom: 28,
+ },
+ sliderCard: {
+ alignSelf: "center",
+ backgroundColor: colors.card,
+ borderColor: colors.border,
+ borderRadius: 8,
+ borderWidth: StyleSheet.hairlineWidth,
+ marginBottom: 14,
+ maxWidth: 460,
+ paddingHorizontal: 18,
+ paddingVertical: 18,
+ width: "100%",
+ shadowColor: "#101828",
+ shadowOffset: {
+ width: 0,
+ height: 8,
+ },
+ shadowOpacity: 0.08,
+ shadowRadius: 18,
+ elevation: 2,
+ },
+ cardTitle: {
+ color: colors.ink,
+ fontSize: 16,
+ fontWeight: "700",
+ lineHeight: 22,
+ marginBottom: 12,
+ textAlign: "center",
},
});
diff --git a/example/src/Examples.tsx b/example/src/Examples.tsx
index cb218c63..a9830c19 100644
--- a/example/src/Examples.tsx
+++ b/example/src/Examples.tsx
@@ -1,6 +1,6 @@
-import React, {FC, JSX, useCallback, useState} from 'react';
-import {Text, View, StyleSheet, Image} from 'react-native';
-import Slider, {MarkerProps, SliderProps} from '@react-native-community/slider';
+import React, {type FC, type JSX, useCallback, useState} from "react";
+import {Image, StyleSheet, Text, View} from "react-native";
+import Slider, {type MarkerProps, type SliderProps} from "@react-native-community/slider";
export interface Props {
title: string;
@@ -12,18 +12,18 @@ const CONSTANTS = {
MAX_VALUE: 100,
MIN_VALUE: 10,
STEP: 10,
- DEFAULT_STEP_RESOLUTION: 100,
} as const;
const SliderExample = (props: SliderProps) => {
const [value, setValue] = useState(props.value ?? 0);
return (
-
+
{value && +value.toFixed(3)}
@@ -83,18 +83,16 @@ const SlidingStepsExample = (props: SliderProps) => {
}, []);
return (
-
-
-
+
);
};
@@ -112,19 +110,17 @@ const SlidingStepsNumbersExample = (props: SliderProps) => {
}, []);
return (
-
-
-
+
);
};
@@ -142,19 +138,17 @@ const SlidingStepsSmallNumbersExample = (props: SliderProps) => {
}, []);
return (
-
-
-
+
);
};
@@ -170,21 +164,20 @@ const SlidingCustomStepsThumbImageNumbersExample = (props: SliderProps) => {
);
}, []);
+
return (
-
-
-
+
);
};
@@ -204,20 +197,18 @@ const SlidingCustomStepsAnotherThumbImageNumbersExample = (
}, []);
return (
-
-
-
+
);
};
@@ -235,21 +226,19 @@ const InvertedSliderWithStepMarker = (props: SliderProps) => {
}, []);
return (
-
-
-
+
);
};
@@ -258,27 +247,25 @@ const SlidingCustomStepsThumbImageWithNumbersAndDifferentWidth = (
) => {
const renderStepMarker = useCallback(({stepMarked}: MarkerProps) => {
return stepMarked ? (
-
+
) : (
-
+
);
}, []);
return (
-
-
-
+
);
};
@@ -292,13 +279,11 @@ const MyStepMarker: FC = ({stepMarked, currentValue}) => {
{currentValue % 1 === 0 ? currentValue : currentValue.toFixed(2)}
) : (
- {'-'}
+ -
)}
@@ -322,12 +307,11 @@ const CustomComponent: FC = ({
{max}
-
- /
-
+ /
);
}
+
return currentValue > index ? (
) : (
@@ -339,31 +323,32 @@ const SliderExampleWithCustomMarker = (props: SliderProps) => {
const [value, setValue] = useState(props.value ?? CONSTANTS.MIN_VALUE);
return (
-
+
{value && +value.toFixed(3)}
);
};
+
const SliderExampleWithCustomComponentAndFilledSteps = (props: SliderProps) => {
const [value, setValue] = useState(props.value || 50);
return (
-
+
{value && +value.toFixed(3)}
{
{...props}
value={value}
onValueChange={setValue}
- minimumTrackTintColor={'#00629A'}
- maximumTrackTintColor={'#979EA4'}
+ minimumTrackTintColor="#00629A"
+ maximumTrackTintColor="#979EA4"
/>
);
@@ -386,17 +371,25 @@ export default SliderExample;
const styles = StyleSheet.create({
text: {
fontSize: 14,
- textAlign: 'center',
- fontWeight: '500',
+ textAlign: "center",
+ fontWeight: "500",
margin: 0,
},
+ exampleContainer: {
+ alignItems: "center",
+ alignSelf: "stretch",
+ },
trackText: {
- color: '#FFFFFF',
+ color: "#FFFFFF",
fontSize: 10,
- justifyContent: 'center',
- alignSelf: 'center',
+ justifyContent: "center",
+ alignSelf: "center",
top: 12,
},
+ trackDividerText: {
+ left: 18,
+ position: "absolute",
+ },
trackDot: {
width: 10,
height: 10,
@@ -404,14 +397,14 @@ const styles = StyleSheet.create({
top: 4,
},
empty: {
- backgroundColor: '#B3BFC9',
+ backgroundColor: "#B3BFC9",
},
filled: {
- backgroundColor: '#00629A',
+ backgroundColor: "#00629A",
},
customComponentFrame: {
flex: 1,
- flexDirection: 'row',
+ flexDirection: "row",
top: -10,
opacity: 0.95,
},
@@ -430,142 +423,150 @@ const styles = StyleSheet.create({
divider: {
width: 2,
height: 20,
- backgroundColor: '#ffffff',
- justifyContent: 'center',
- alignItems: 'center',
+ backgroundColor: "#ffffff",
+ justifyContent: "center",
+ alignItems: "center",
},
separator: {
width: 2,
height: 20,
- backgroundColor: '#00629A',
- justifyContent: 'center',
- alignItems: 'center',
+ backgroundColor: "#00629A",
+ justifyContent: "center",
+ alignItems: "center",
},
label: {
marginTop: 10,
width: 55,
paddingVertical: 5,
paddingHorizontal: 10,
- backgroundColor: '#ffffff',
- shadowColor: '#000000',
+ backgroundColor: "#ffffff",
+ shadowColor: "#000000",
shadowOffset: {
width: 0,
height: 1,
},
shadowOpacity: 0.4,
shadowRadius: 4,
- justifyContent: 'center',
- alignItems: 'center',
+ justifyContent: "center",
+ alignItems: "center",
},
background: {
- justifyContent: 'center',
- alignItems: 'center',
+ justifyContent: "center",
+ alignItems: "center",
},
tinyLogo: {
marginVertical: 2,
aspectRatio: 1,
flex: 1,
- height: '100%',
- width: '100%',
- },
- minMaxLabel: {
- flexDirection: 'row',
- zIndex: -1,
+ height: "100%",
+ width: "100%",
},
slider: {
- width: 300,
+ alignSelf: "stretch",
+ width: "100%",
opacity: 1,
marginTop: 10,
+ height: 44,
+ },
+ narrowSlider: {
+ width: 200,
},
outer: {
width: 20,
height: 20,
borderRadius: 10,
- backgroundColor: '#11FF11',
- justifyContent: 'center',
- alignItems: 'center',
+ backgroundColor: "#11FF11",
+ justifyContent: "center",
+ alignItems: "center",
},
outerTrue: {
width: 20,
height: 20,
borderRadius: 10,
- backgroundColor: '#0F0FFF',
- justifyContent: 'center',
- alignItems: 'center',
+ backgroundColor: "#0F0FFF",
+ justifyContent: "center",
+ alignItems: "center",
},
inner: {
width: 10,
height: 10,
borderRadius: 5,
- backgroundColor: '#111111',
+ backgroundColor: "#111111",
},
innerTrue: {
width: 10,
height: 10,
borderRadius: 5,
- backgroundColor: '#0F0FFF',
+ backgroundColor: "#0F0FFF",
+ },
+ offsetStepMarker: {
+ top: 3,
},
container: {
- alignItems: 'center',
+ alignItems: "center",
+ },
+ customMarkerContainer: {
+ alignItems: "center",
+ paddingBottom: 80,
},
outerSmall: {
width: 4,
height: 4,
top: 6,
borderRadius: 2,
- backgroundColor: '#003366',
- justifyContent: 'center',
- alignItems: 'center',
+ backgroundColor: "#003366",
+ justifyContent: "center",
+ alignItems: "center",
},
outerTrueSmall: {
width: 8,
height: 8,
borderRadius: 2,
- backgroundColor: '#ABCDEF',
- justifyContent: 'center',
- alignItems: 'center',
+ backgroundColor: "#ABCDEF",
+ justifyContent: "center",
+ alignItems: "center",
},
innerSmall: {
width: 7,
height: 7,
borderRadius: 1,
- backgroundColor: '#223366',
+ backgroundColor: "#223366",
},
innerTrueSmall: {
width: 7,
height: 7,
borderRadius: 1,
- backgroundColor: '#334488',
+ backgroundColor: "#334488",
},
});
export const examples: Props[] = [
{
- title: 'Default settings',
+ title: "Default settings",
render() {
return ;
},
},
{
- title: 'Initial value: 0.5',
+ title: "Initial value: 0.5",
render() {
return ;
},
},
{
- title: 'minimumValue: -1, maximumValue: 2',
- render(): React.ReactElement {
+ title: "minimumValue: -1, maximumValue: 2",
+ render() {
return ;
},
},
{
- title: 'step: 0.25, tap to seek on iOS',
- render(): React.ReactElement {
- return ;
+ title: "step: 0.25, tap to seek on iOS",
+ render() {
+ return ;
},
},
{
- title: 'Limit on positive values [30, 80]',
+ title: "Limit on positive values [30, 80]",
render() {
return (
;
},
},
{
- title: 'onSlidingComplete',
+ title: "onSlidingComplete",
render() {
return ;
},
},
{
- title: 'Custom min/max track tint color',
+ title: "Custom min/max track tint color",
render() {
return (
);
},
},
{
- title: 'Custom thumb tint color',
+ title: "Custom thumb tint color",
render() {
- return ;
+ return ;
},
},
{
- title: 'Custom thumb image',
+ title: "Custom thumb image",
+ platform: "ios",
render() {
- return (
-
- );
+ return ;
},
},
{
- title: 'Custom thumb (network image)',
- platform: 'windows',
+ title: "Custom thumb (network image)",
+ platform: "windows",
render() {
return (
);
},
},
{
- title: 'Custom track image',
- platform: 'ios',
+ title: "Custom track image",
+ platform: "ios",
render() {
- return ;
+ return ;
},
},
{
- title: 'Custom min/max track image',
- platform: 'ios',
+ title: "Custom min/max track image",
+ platform: "ios",
render() {
return (
);
},
},
{
- title: 'Slider with customized indicator and no numbers',
+ title: "Slider with customized indicator and no numbers",
render() {
return ;
},
},
{
- title: 'Slider with customized indicator and default numbers',
+ title: "Slider with customized indicator and default numbers",
render() {
return ;
},
},
{
- title: 'Slider with smaller customized indicator and default numbers',
+ title: "Slider with smaller customized indicator and default numbers",
render() {
return ;
},
},
{
- title: 'Slider with custom steps, thumbImage and steps numbers',
+ title: "Slider with custom steps, thumbImage and steps numbers",
render() {
return ;
},
},
{
- title: 'Slider with custom steps, different thumbImage and steps numbers',
+ title: "Slider with custom steps, different thumbImage and steps numbers",
render() {
return ;
},
},
{
- title: 'Slider with custom steps, different width and thumbImage',
+ title: "Slider with custom steps, different width and thumbImage",
render() {
return ;
},
},
{
- title: 'Inverted slider direction with steps number and thumbImage',
+ title: "Inverted slider direction with steps number and thumbImage",
render() {
return ;
},
},
{
- title: 'Custom step marker settings',
+ title: "Custom step marker settings",
render() {
return ;
},
},
{
- title: 'Custom component with steps filled when passed',
+ title: "Custom component with steps filled when passed",
render() {
return ;
},
},
{
- title: 'Inverted slider direction',
+ title: "Inverted slider direction",
render() {
return ;
},
},
{
- title: 'Vertical slider',
- platform: 'windows',
+ title: "Vertical slider",
+ platform: "windows",
render() {
return ;
},
},
{
- title: 'Disabled slider',
+ title: "Disabled slider",
render() {
return ;
},
},
{
- title: 'Slider with accessibilityState disabled',
- platform: 'android',
+ title: "Slider with accessibilityState disabled",
+ platform: "android",
render() {
return ;
},
},
{
- title: 'Custom thumb size (no image)',
+ title: "Custom thumb size (no image)",
render() {
- return ;
+ return ;
},
},
{
- title: 'Custom thumb size (scaled image)',
+ title: "Custom thumb size (scaled image)",
+ platform: "ios",
render() {
return (
);
diff --git a/example/src/Props.tsx b/example/src/Props.tsx
index 22498bd0..29f355b2 100644
--- a/example/src/Props.tsx
+++ b/example/src/Props.tsx
@@ -1,18 +1,24 @@
-import React, {JSX, useState} from 'react';
-import {Text, View, StyleSheet} from 'react-native';
-import Slider, {SliderProps} from '@react-native-community/slider';
+import React, {type JSX, useState} from "react";
+import {StyleSheet, Text, View} from "react-native";
+import Slider, {type SliderProps} from "@react-native-community/slider";
export interface Props {
title: string;
render(): JSX.Element;
+ platform?: string;
}
const SliderExample = (props: SliderProps) => {
const [value, setValue] = useState(0);
return (
-
+
{value && +value.toFixed(3)}
-
+
);
};
@@ -57,143 +63,148 @@ const SlidingCompleteExample = () => {
export default SliderExample;
const styles = StyleSheet.create({
+ exampleContainer: {
+ alignSelf: "stretch",
+ },
slider: {
- width: 300,
+ alignSelf: "stretch",
+ width: "100%",
opacity: 1,
height: 50,
marginTop: 10,
},
text: {
fontSize: 14,
- textAlign: 'center',
- fontWeight: '500',
+ textAlign: "center",
+ fontWeight: "500",
margin: 0,
},
});
export const propsExamples: Props[] = [
{
- title: 'Default settings',
+ title: "Default settings",
render() {
return ;
},
},
{
- title: 'disabled',
+ title: "disabled",
render() {
return ;
},
},
{
- title: 'maximumValue',
+ title: "maximumValue",
render() {
return ;
},
},
{
- title: 'minimumTrackTintColor',
+ title: "minimumTrackTintColor",
render() {
return ;
},
},
{
- title: 'minimumValue',
+ title: "minimumValue",
render() {
return ;
},
},
{
- title: 'onSlidingStart',
+ title: "onSlidingStart",
render() {
return ;
},
},
{
- title: 'onSlidingComplete',
+ title: "onSlidingComplete",
render() {
return ;
},
},
{
- title: 'onValueChange',
+ title: "onValueChange",
render() {
return ;
},
},
{
- title: 'step',
+ title: "step",
render() {
return ;
},
},
{
- title: 'maximumTrackTintColor',
+ title: "maximumTrackTintColor",
render() {
return ;
},
},
{
- title: 'value',
+ title: "value",
render() {
return ;
},
},
{
- title: 'tapToSeek',
- render(): React.ReactElement {
- return ;
+ title: "tapToSeek",
+ render() {
+ return ;
},
},
{
- title: 'inverted',
+ title: "inverted",
render() {
return ;
},
},
{
- title: 'vertical',
+ title: "vertical",
+ platform: "windows",
render() {
return ;
},
},
{
- title: 'thumbTintColor',
+ title: "thumbTintColor",
render() {
- return ;
+ return ;
},
},
{
- title: 'maximumTrackImage',
+ title: "maximumTrackImage",
+ platform: "ios",
render() {
return (
);
},
},
{
- title: 'minimumTrackImage',
+ title: "minimumTrackImage",
+ platform: "ios",
render() {
return (
-
+
);
},
},
{
- title: 'thumbImage',
+ title: "thumbImage",
+ platform: "ios",
render() {
- return (
-
- );
+ return ;
},
},
{
- title: 'trackImage',
+ title: "trackImage",
+ platform: "ios",
render() {
- return ;
+ return ;
},
},
];
diff --git a/example/tsconfig.json b/example/tsconfig.json
index 304ab4e2..266ba9ca 100644
--- a/example/tsconfig.json
+++ b/example/tsconfig.json
@@ -1,3 +1,8 @@
{
- "extends": "@react-native/typescript-config/tsconfig.json"
+ "extends": "@react-native/typescript-config",
+ "compilerOptions": {
+ "types": ["jest"]
+ },
+ "include": ["**/*.ts", "**/*.tsx"],
+ "exclude": ["**/node_modules", "**/Pods"]
}
diff --git a/example/windows/.gitignore b/example/windows/.gitignore
deleted file mode 100644
index 878f7ba5..00000000
--- a/example/windows/.gitignore
+++ /dev/null
@@ -1,92 +0,0 @@
-*AppPackages*
-*BundleArtifacts*
-
-#OS junk files
-[Tt]humbs.db
-*.DS_Store
-
-#Visual Studio files
-*.[Oo]bj
-*.user
-*.aps
-*.pch
-*.vspscc
-*.vssscc
-*_i.c
-*_p.c
-*.ncb
-*.suo
-*.tlb
-*.tlh
-*.bak
-*.[Cc]ache
-*.ilk
-*.log
-*.lib
-*.sbr
-*.sdf
-*.opensdf
-*.opendb
-*.unsuccessfulbuild
-ipch/
-[Oo]bj/
-[Bb]in
-[Dd]ebug*/
-[Rr]elease*/
-Ankh.NoLoad
-
-# Visual C++ cache files
-ipch/
-*.aps
-*.ncb
-*.opendb
-*.opensdf
-*.sdf
-*.cachefile
-*.VC.db
-*.VC.VC.opendb
-
-#MonoDevelop
-*.pidb
-*.userprefs
-
-#Tooling
-_ReSharper*/
-*.resharper
-[Tt]est[Rr]esult*
-*.sass-cache
-
-#Project files
-[Bb]uild/
-
-#Subversion files
-.svn
-
-# Office Temp Files
-~$*
-
-# vim Temp Files
-*~
-
-#NuGet
-packages/
-*.nupkg
-
-#ncrunch
-*ncrunch*
-*crunch*.local.xml
-
-# visual studio database projects
-*.dbmdl
-
-#Test files
-*.testsettings
-
-#Other files
-*.DotSettings
-.vs/
-*project.lock.json
-
-#Files generated by the VS build
-**/Generated Files/**
-
diff --git a/example/windows/ExperimentalFeatures.props b/example/windows/ExperimentalFeatures.props
deleted file mode 100644
index de7f6330..00000000
--- a/example/windows/ExperimentalFeatures.props
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
- true
-
-
- false
-
- true
-
-
-
-
diff --git a/example/windows/NuGet.Config b/example/windows/NuGet.Config
deleted file mode 100644
index c7612b0b..00000000
--- a/example/windows/NuGet.Config
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/example/windows/example.sln b/example/windows/example.sln
deleted file mode 100644
index 02ad0d4a..00000000
--- a/example/windows/example.sln
+++ /dev/null
@@ -1,171 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 17
-VisualStudioVersion = 17.3.32929.385
-MinimumVisualStudioVersion = 10.0.40219.1
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "example", "example\example.vcxproj", "{B18DBFA9-1510-4CC9-801D-E3DA5168024E}"
- ProjectSection(ProjectDependencies) = postProject
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {F7D32BD0-2749-483E-9A0D-1635EF7E3136}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Folly", "..\node_modules\react-native-windows\Folly\Folly.vcxproj", "{A990658C-CE31-4BCC-976F-0FC6B1AF693D}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fmt", "..\node_modules\react-native-windows\fmt\fmt.vcxproj", "{14B93DC8-FD93-4A6D-81CB-8BC96644501C}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ReactCommon", "..\node_modules\react-native-windows\ReactCommon\ReactCommon.vcxproj", "{A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}"
- ProjectSection(ProjectDependencies) = postProject
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {A990658C-CE31-4BCC-976F-0FC6B1AF693D}
- EndProjectSection
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Chakra", "..\node_modules\react-native-windows\Chakra\Chakra.vcxitems", "{C38970C0-5FBF-4D69-90D8-CBAC225AE895}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative", "..\node_modules\react-native-windows\Microsoft.ReactNative\Microsoft.ReactNative.vcxproj", "{F7D32BD0-2749-483E-9A0D-1635EF7E3136}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Cxx", "..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems", "{DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Common", "..\node_modules\react-native-windows\Common\Common.vcxproj", "{FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "ReactNative", "ReactNative", "{5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Microsoft.ReactNative.Shared", "..\node_modules\react-native-windows\Shared\Shared.vcxitems", "{2049DBE9-8D13-42C9-AE4B-413AE38FFFD0}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Mso", "..\node_modules\react-native-windows\Mso\Mso.vcxitems", "{84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Include", "..\node_modules\react-native-windows\include\Include.vcxitems", "{EF074BA1-2D54-4D49-A28E-5E040B47CD2E}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SliderWindows", "..\node_modules\@react-native-community\slider\windows\SliderWindows\SliderWindows.vcxproj", "{685A83AE-36BC-4E9D-BDC6-417EBF168463}"
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|ARM64 = Debug|ARM64
- Debug|x64 = Debug|x64
- Debug|x86 = Debug|x86
- Release|ARM64 = Release|ARM64
- Release|x64 = Release|x64
- Release|x86 = Release|x86
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|ARM64.Build.0 = Debug|ARM64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|ARM64.Deploy.0 = Debug|ARM64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|x64.ActiveCfg = Debug|x64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|x64.Build.0 = Debug|x64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|x64.Deploy.0 = Debug|x64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|x86.ActiveCfg = Debug|Win32
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|x86.Build.0 = Debug|Win32
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Debug|x86.Deploy.0 = Debug|Win32
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|ARM64.ActiveCfg = Release|ARM64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|ARM64.Build.0 = Release|ARM64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|ARM64.Deploy.0 = Release|ARM64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|x64.ActiveCfg = Release|x64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|x64.Build.0 = Release|x64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|x64.Deploy.0 = Release|x64
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|x86.ActiveCfg = Release|Win32
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|x86.Build.0 = Release|Win32
- {B18DBFA9-1510-4CC9-801D-E3DA5168024E}.Release|x86.Deploy.0 = Release|Win32
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|ARM64.Build.0 = Debug|ARM64
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.ActiveCfg = Debug|x64
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x64.Build.0 = Debug|x64
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.ActiveCfg = Debug|Win32
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Debug|x86.Build.0 = Debug|Win32
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.ActiveCfg = Release|ARM64
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|ARM64.Build.0 = Release|ARM64
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.ActiveCfg = Release|x64
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x64.Build.0 = Release|x64
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.ActiveCfg = Release|Win32
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D}.Release|x86.Build.0 = Release|Win32
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Debug|ARM64.Build.0 = Debug|ARM64
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Debug|x64.ActiveCfg = Debug|x64
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Debug|x64.Build.0 = Debug|x64
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Debug|x86.ActiveCfg = Debug|Win32
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Debug|x86.Build.0 = Debug|Win32
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Debug|x86.Deploy.0 = Debug|Win32
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Release|ARM64.ActiveCfg = Release|ARM64
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Release|ARM64.Build.0 = Release|ARM64
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Release|x64.ActiveCfg = Release|x64
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Release|x64.Build.0 = Release|x64
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Release|x86.ActiveCfg = Release|Win32
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Release|x86.Build.0 = Release|Win32
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C}.Release|x86.Deploy.0 = Release|Win32
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|ARM64.Build.0 = Debug|ARM64
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.ActiveCfg = Debug|x64
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x64.Build.0 = Debug|x64
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.ActiveCfg = Debug|Win32
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Debug|x86.Build.0 = Debug|Win32
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.ActiveCfg = Release|ARM64
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|ARM64.Build.0 = Release|ARM64
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.ActiveCfg = Release|x64
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x64.Build.0 = Release|x64
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.ActiveCfg = Release|Win32
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD}.Release|x86.Build.0 = Release|Win32
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|ARM64.Build.0 = Debug|ARM64
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.ActiveCfg = Debug|x64
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x64.Build.0 = Debug|x64
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.ActiveCfg = Debug|Win32
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Debug|x86.Build.0 = Debug|Win32
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.ActiveCfg = Release|ARM64
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|ARM64.Build.0 = Release|ARM64
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.ActiveCfg = Release|x64
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x64.Build.0 = Release|x64
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.ActiveCfg = Release|Win32
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136}.Release|x86.Build.0 = Release|Win32
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|ARM64.Build.0 = Debug|ARM64
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.ActiveCfg = Debug|x64
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x64.Build.0 = Debug|x64
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.ActiveCfg = Debug|Win32
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Debug|x86.Build.0 = Debug|Win32
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.ActiveCfg = Release|ARM64
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|ARM64.Build.0 = Release|ARM64
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.ActiveCfg = Release|x64
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x64.Build.0 = Release|x64
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.ActiveCfg = Release|Win32
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D}.Release|x86.Build.0 = Release|Win32
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Debug|ARM64.ActiveCfg = Debug|ARM64
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Debug|ARM64.Build.0 = Debug|ARM64
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Debug|x64.ActiveCfg = Debug|x64
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Debug|x64.Build.0 = Debug|x64
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Debug|x86.ActiveCfg = Debug|Win32
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Debug|x86.Build.0 = Debug|Win32
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Release|ARM64.ActiveCfg = Release|ARM64
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Release|ARM64.Build.0 = Release|ARM64
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Release|x64.ActiveCfg = Release|x64
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Release|x64.Build.0 = Release|x64
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Release|x86.ActiveCfg = Release|Win32
- {685A83AE-36BC-4E9D-BDC6-417EBF168463}.Release|x86.Build.0 = Release|Win32
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {A990658C-CE31-4BCC-976F-0FC6B1AF693D} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {14B93DC8-FD93-4A6D-81CB-8BC96644501C} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {A9D95A91-4DB7-4F72-BEB6-FE8A5C89BFBD} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {C38970C0-5FBF-4D69-90D8-CBAC225AE895} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {F7D32BD0-2749-483E-9A0D-1635EF7E3136} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {DA8B35B3-DA00-4B02-BDE6-6A397B3FD46B} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {FCA38F3C-7C73-4C47-BE4E-32F77FA8538D} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {2049DBE9-8D13-42C9-AE4B-413AE38FFFD0} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {84E05BFA-CBAF-4F0D-BFB6-4CE85742A57E} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- {EF074BA1-2D54-4D49-A28E-5E040B47CD2E} = {5EA20F54-880A-49F3-99FA-4B3FE54E8AB1}
- EndGlobalSection
- GlobalSection(ExtensibilityGlobals) = postSolution
- SolutionGuid = {D43FAD39-F619-437D-BB40-04A3982ACB6A}
- EndGlobalSection
- GlobalSection(SharedMSBuildProjectFiles) = preSolution
- ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{2049dbe9-8d13-42c9-ae4b-413ae38fffd0}*SharedItemsImports = 9
- ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{685a83ae-36bc-4e9d-bdc6-417ebf168463}*SharedItemsImports = 4
- ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{84e05bfa-cbaf-4f0d-bfb6-4ce85742a57e}*SharedItemsImports = 9
- ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{c38970c0-5fbf-4d69-90d8-cbac225ae895}*SharedItemsImports = 9
- ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{da8b35b3-da00-4b02-bde6-6a397b3fd46b}*SharedItemsImports = 9
- ..\node_modules\react-native-windows\include\Include.vcxitems*{ef074ba1-2d54-4d49-a28e-5e040b47cd2e}*SharedItemsImports = 9
- ..\node_modules\react-native-windows\Chakra\Chakra.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
- ..\node_modules\react-native-windows\Microsoft.ReactNative.Cxx\Microsoft.ReactNative.Cxx.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
- ..\node_modules\react-native-windows\Mso\Mso.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
- ..\node_modules\react-native-windows\Shared\Shared.vcxitems*{f7d32bd0-2749-483e-9a0d-1635ef7e3136}*SharedItemsImports = 4
- EndGlobalSection
-EndGlobal
diff --git a/example/windows/example/.gitignore b/example/windows/example/.gitignore
deleted file mode 100644
index cd828d9f..00000000
--- a/example/windows/example/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-/Bundle
diff --git a/example/windows/example/App.cpp b/example/windows/example/App.cpp
deleted file mode 100644
index e8efa1fd..00000000
--- a/example/windows/example/App.cpp
+++ /dev/null
@@ -1,93 +0,0 @@
-#include "pch.h"
-
-#include "App.h"
-
-#include "AutolinkedNativeModules.g.h"
-#include "ReactPackageProvider.h"
-
-using namespace winrt;
-using namespace xaml;
-using namespace xaml::Controls;
-using namespace xaml::Navigation;
-
-using namespace Windows::ApplicationModel;
-namespace winrt::example::implementation
-{
-///
-/// Initializes the singleton application object. This is the first line of
-/// authored code executed, and as such is the logical equivalent of main() or
-/// WinMain().
-///
-App::App() noexcept
-{
-#if BUNDLE
- JavaScriptBundleFile(L"index.windows");
- InstanceSettings().UseFastRefresh(false);
-#else
- JavaScriptBundleFile(L"index");
- InstanceSettings().UseFastRefresh(true);
-#endif
-
-#if _DEBUG
- InstanceSettings().UseDirectDebugger(true);
- InstanceSettings().UseDeveloperSupport(true);
-#else
- InstanceSettings().UseDirectDebugger(false);
- InstanceSettings().UseDeveloperSupport(false);
-#endif
-
- RegisterAutolinkedNativeModulePackages(PackageProviders()); // Includes any autolinked modules
-
- PackageProviders().Append(make()); // Includes all modules in this project
-
- InitializeComponent();
-}
-
-///
-/// Invoked when the application is launched normally by the end user. Other entry points
-/// will be used such as when the application is launched to open a specific file.
-///
-/// Details about the launch request and process.
-void App::OnLaunched(activation::LaunchActivatedEventArgs const& e)
-{
- super::OnLaunched(e);
-
- Frame rootFrame = Window::Current().Content().as ();
- rootFrame.Navigate(xaml_typename(), box_value(e.Arguments()));
-}
-
-///
-/// Invoked when the application is activated by some means other than normal launching.
-///
-void App::OnActivated(Activation::IActivatedEventArgs const &e) {
- auto preActivationContent = Window::Current().Content();
- super::OnActivated(e);
- if (!preActivationContent && Window::Current()) {
- Frame rootFrame = Window::Current().Content().as ();
- rootFrame.Navigate(xaml_typename(), nullptr);
- }
-}
-
-///
-/// Invoked when application execution is being suspended. Application state is saved
-/// without knowing whether the application will be terminated or resumed with the contents
-/// of memory still intact.
-///
-/// The source of the suspend request.
-/// Details about the suspend request.
-void App::OnSuspending([[maybe_unused]] IInspectable const& sender, [[maybe_unused]] SuspendingEventArgs const& e)
-{
- // Save application state and stop any background activity
-}
-
-///
-/// Invoked when Navigation to a certain page fails
-///
-/// The Frame which failed navigation
-/// Details about the navigation failure
-void App::OnNavigationFailed(IInspectable const&, NavigationFailedEventArgs const& e)
-{
- throw hresult_error(E_FAIL, hstring(L"Failed to load Page ") + e.SourcePageType().Name);
-}
-
-} // namespace winrt::example::implementation
diff --git a/example/windows/example/App.h b/example/windows/example/App.h
deleted file mode 100644
index eb2d5a58..00000000
--- a/example/windows/example/App.h
+++ /dev/null
@@ -1,21 +0,0 @@
-#pragma once
-
-#include "App.xaml.g.h"
-
-#include
-
-namespace activation = winrt::Windows::ApplicationModel::Activation;
-
-namespace winrt::example::implementation
-{
- struct App : AppT
- {
- App() noexcept;
- void OnLaunched(activation::LaunchActivatedEventArgs const&);
- void OnActivated(Windows::ApplicationModel::Activation::IActivatedEventArgs const &e);
- void OnSuspending(IInspectable const&, Windows::ApplicationModel::SuspendingEventArgs const&);
- void OnNavigationFailed(IInspectable const&, xaml::Navigation::NavigationFailedEventArgs const&);
- private:
- using super = AppT;
- };
-} // namespace winrt::example::implementation
diff --git a/example/windows/example/App.idl b/example/windows/example/App.idl
deleted file mode 100644
index ad6a721d..00000000
--- a/example/windows/example/App.idl
+++ /dev/null
@@ -1,3 +0,0 @@
-namespace example
-{
-}
diff --git a/example/windows/example/App.xaml b/example/windows/example/App.xaml
deleted file mode 100644
index bda9267c..00000000
--- a/example/windows/example/App.xaml
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
diff --git a/example/windows/example/Assets/LockScreenLogo.scale-200.png b/example/windows/example/Assets/LockScreenLogo.scale-200.png
deleted file mode 100644
index 735f57ad..00000000
Binary files a/example/windows/example/Assets/LockScreenLogo.scale-200.png and /dev/null differ
diff --git a/example/windows/example/Assets/SplashScreen.scale-200.png b/example/windows/example/Assets/SplashScreen.scale-200.png
deleted file mode 100644
index 023e7f1f..00000000
Binary files a/example/windows/example/Assets/SplashScreen.scale-200.png and /dev/null differ
diff --git a/example/windows/example/Assets/Square150x150Logo.scale-200.png b/example/windows/example/Assets/Square150x150Logo.scale-200.png
deleted file mode 100644
index af49fec1..00000000
Binary files a/example/windows/example/Assets/Square150x150Logo.scale-200.png and /dev/null differ
diff --git a/example/windows/example/Assets/Square44x44Logo.scale-200.png b/example/windows/example/Assets/Square44x44Logo.scale-200.png
deleted file mode 100644
index ce342a2e..00000000
Binary files a/example/windows/example/Assets/Square44x44Logo.scale-200.png and /dev/null differ
diff --git a/example/windows/example/Assets/Square44x44Logo.targetsize-24_altform-unplated.png b/example/windows/example/Assets/Square44x44Logo.targetsize-24_altform-unplated.png
deleted file mode 100644
index f6c02ce9..00000000
Binary files a/example/windows/example/Assets/Square44x44Logo.targetsize-24_altform-unplated.png and /dev/null differ
diff --git a/example/windows/example/Assets/StoreLogo.png b/example/windows/example/Assets/StoreLogo.png
deleted file mode 100644
index 7385b56c..00000000
Binary files a/example/windows/example/Assets/StoreLogo.png and /dev/null differ
diff --git a/example/windows/example/Assets/Wide310x150Logo.scale-200.png b/example/windows/example/Assets/Wide310x150Logo.scale-200.png
deleted file mode 100644
index 288995b3..00000000
Binary files a/example/windows/example/Assets/Wide310x150Logo.scale-200.png and /dev/null differ
diff --git a/example/windows/example/AutolinkedNativeModules.g.cpp b/example/windows/example/AutolinkedNativeModules.g.cpp
deleted file mode 100644
index cefeac35..00000000
--- a/example/windows/example/AutolinkedNativeModules.g.cpp
+++ /dev/null
@@ -1,18 +0,0 @@
-// AutolinkedNativeModules.g.cpp contents generated by "npx @react-native-community/cli autolink-windows"
-// clang-format off
-#include "pch.h"
-#include "AutolinkedNativeModules.g.h"
-
-// Includes from @react-native-community/slider
-#include
-
-namespace winrt::Microsoft::ReactNative
-{
-
-void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation::Collections::IVector const& packageProviders)
-{
- // IReactPackageProviders from @react-native-community/slider
- packageProviders.Append(winrt::SliderWindows::ReactPackageProvider());
-}
-
-}
diff --git a/example/windows/example/AutolinkedNativeModules.g.h b/example/windows/example/AutolinkedNativeModules.g.h
deleted file mode 100644
index 95343bbd..00000000
--- a/example/windows/example/AutolinkedNativeModules.g.h
+++ /dev/null
@@ -1,10 +0,0 @@
-// AutolinkedNativeModules.g.h contents generated by "npx @react-native-community/cli autolink-windows"
-// clang-format off
-#pragma once
-
-namespace winrt::Microsoft::ReactNative
-{
-
-void RegisterAutolinkedNativeModulePackages(winrt::Windows::Foundation::Collections::IVector const& packageProviders);
-
-}
diff --git a/example/windows/example/AutolinkedNativeModules.g.props b/example/windows/example/AutolinkedNativeModules.g.props
deleted file mode 100644
index d12701bf..00000000
--- a/example/windows/example/AutolinkedNativeModules.g.props
+++ /dev/null
@@ -1,6 +0,0 @@
-
-
-
-
-
-
diff --git a/example/windows/example/AutolinkedNativeModules.g.targets b/example/windows/example/AutolinkedNativeModules.g.targets
deleted file mode 100644
index ef4e058e..00000000
--- a/example/windows/example/AutolinkedNativeModules.g.targets
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
- {685a83ae-36bc-4e9d-bdc6-417ebf168463}
-
-
-
diff --git a/example/windows/example/MainPage.cpp b/example/windows/example/MainPage.cpp
deleted file mode 100644
index b09666f2..00000000
--- a/example/windows/example/MainPage.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-#include "pch.h"
-#include "MainPage.h"
-#if __has_include("MainPage.g.cpp")
-#include "MainPage.g.cpp"
-#endif
-
-#include "App.h"
-
-using namespace winrt;
-using namespace xaml;
-
-namespace winrt::example::implementation
-{
- MainPage::MainPage()
- {
- InitializeComponent();
- auto app = Application::Current().as();
- ReactRootView().ReactNativeHost(app->Host());
- }
-}
diff --git a/example/windows/example/MainPage.h b/example/windows/example/MainPage.h
deleted file mode 100644
index 5ed917d5..00000000
--- a/example/windows/example/MainPage.h
+++ /dev/null
@@ -1,19 +0,0 @@
-#pragma once
-#include "MainPage.g.h"
-#include
-
-namespace winrt::example::implementation
-{
- struct MainPage : MainPageT
- {
- MainPage();
- };
-}
-
-namespace winrt::example::factory_implementation
-{
- struct MainPage : MainPageT
- {
- };
-}
-
diff --git a/example/windows/example/MainPage.idl b/example/windows/example/MainPage.idl
deleted file mode 100644
index ae088fea..00000000
--- a/example/windows/example/MainPage.idl
+++ /dev/null
@@ -1,10 +0,0 @@
-#include "NamespaceRedirect.h"
-
-namespace example
-{
- [default_interface]
- runtimeclass MainPage : XAML_NAMESPACE.Controls.Page
- {
- MainPage();
- }
-}
diff --git a/example/windows/example/MainPage.xaml b/example/windows/example/MainPage.xaml
deleted file mode 100644
index b9794628..00000000
--- a/example/windows/example/MainPage.xaml
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
diff --git a/example/windows/example/Package.appxmanifest b/example/windows/example/Package.appxmanifest
deleted file mode 100644
index 9df757b2..00000000
--- a/example/windows/example/Package.appxmanifest
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
-
-
-
-
- example
- Bartosz Klonowski
- Assets\StoreLogo.png
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/example/windows/example/PropertySheet.props b/example/windows/example/PropertySheet.props
deleted file mode 100644
index 85d927cd..00000000
--- a/example/windows/example/PropertySheet.props
+++ /dev/null
@@ -1,16 +0,0 @@
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/example/windows/example/ReactPackageProvider.cpp b/example/windows/example/ReactPackageProvider.cpp
deleted file mode 100644
index ceb889ff..00000000
--- a/example/windows/example/ReactPackageProvider.cpp
+++ /dev/null
@@ -1,15 +0,0 @@
-#include "pch.h"
-#include "ReactPackageProvider.h"
-#include "NativeModules.h"
-
-using namespace winrt::Microsoft::ReactNative;
-
-namespace winrt::example::implementation
-{
-
-void ReactPackageProvider::CreatePackage(IReactPackageBuilder const &packageBuilder) noexcept
-{
- AddAttributedModules(packageBuilder, true);
-}
-
-} // namespace winrt::example::implementation
diff --git a/example/windows/example/ReactPackageProvider.h b/example/windows/example/ReactPackageProvider.h
deleted file mode 100644
index 73379511..00000000
--- a/example/windows/example/ReactPackageProvider.h
+++ /dev/null
@@ -1,13 +0,0 @@
-#pragma once
-
-#include "winrt/Microsoft.ReactNative.h"
-
-namespace winrt::example::implementation
-{
- struct ReactPackageProvider : winrt::implements
- {
- public: // IReactPackageProvider
- void CreatePackage(winrt::Microsoft::ReactNative::IReactPackageBuilder const &packageBuilder) noexcept;
- };
-} // namespace winrt::example::implementation
-
diff --git a/example/windows/example/example.vcxproj b/example/windows/example/example.vcxproj
deleted file mode 100644
index 41f89b63..00000000
--- a/example/windows/example/example.vcxproj
+++ /dev/null
@@ -1,173 +0,0 @@
-
-
-
-
-
- true
- true
- true
- {b18dbfa9-1510-4cc9-801d-e3da5168024e}
- example
- example
- en-US
- 17.0
- true
- Windows Store
- 10.0
-
-
- $([MSBuild]::GetDirectoryNameOfFileAbove($(SolutionDir), 'node_modules\react-native-windows\package.json'))\node_modules\react-native-windows\
-
-
-
-
-
- Debug
- ARM64
-
-
- Debug
- Win32
-
-
- Debug
- x64
-
-
- Release
- ARM64
-
-
- Release
- Win32
-
-
- Release
- x64
-
-
-
- Application
- Unicode
-
-
- true
- true
-
-
- false
- true
- false
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Use
- pch.h
- $(IntDir)pch.pch
- Level4
- %(AdditionalOptions) /bigobj
- 4453;28204
-
-
-
-
- _DEBUG;%(PreprocessorDefinitions)
-
-
-
-
- NDEBUG;%(PreprocessorDefinitions)
-
-
-
-
- MainPage.xaml
- Code
-
-
-
-
-
- App.xaml
-
-
-
-
- Designer
-
-
-
-
- Designer
-
-
-
-
-
-
-
-
-
-
-
-
-
- MainPage.xaml
- Code
-
-
-
-
- Create
-
-
- App.xaml
-
-
-
-
-
- App.xaml
-
-
- MainPage.xaml
- Code
-
-
-
-
-
- false
-
-
-
-
- Designer
-
-
-
-
-
-
-
-
-
-
- This project references targets in your node_modules\react-native-windows folder that are missing. The missing file is {0}.
-
-
-
-
-
diff --git a/example/windows/example/example.vcxproj.filters b/example/windows/example/example.vcxproj.filters
deleted file mode 100644
index ec2808a9..00000000
--- a/example/windows/example/example.vcxproj.filters
+++ /dev/null
@@ -1,62 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Assets
-
-
- Assets
-
-
- Assets
-
-
- Assets
-
-
- Assets
-
-
- Assets
-
-
- Assets
-
-
-
-
-
-
-
- {e48dc53e-40b1-40cb-970a-f89935452892}
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/example/windows/example/packages.lock.json b/example/windows/example/packages.lock.json
deleted file mode 100644
index ef739131..00000000
--- a/example/windows/example/packages.lock.json
+++ /dev/null
@@ -1,128 +0,0 @@
-{
- "version": 1,
- "dependencies": {
- "native,Version=v0.0": {
- "Microsoft.JavaScript.Hermes": {
- "type": "Direct",
- "requested": "[0.1.23, )",
- "resolved": "0.1.23",
- "contentHash": "cA9t1GjY4Yo0JD1AfA//e1lOwk48hLANfuX6GXrikmEBNZVr2TIX5ONJt5tqCnpZyLz6xGiPDgTfFNKbSfb21g=="
- },
- "Microsoft.UI.Xaml": {
- "type": "Direct",
- "requested": "[2.8.0, )",
- "resolved": "2.8.0",
- "contentHash": "vxdHxTr63s5KVtNddMFpgvjBjUH50z7seq/5jLWmmSuf8poxg+sXrywkofUdE8ZstbpO9y3FL/IXXUcPYbeesA==",
- "dependencies": {
- "Microsoft.Web.WebView2": "1.0.1264.42"
- }
- },
- "Microsoft.Windows.CppWinRT": {
- "type": "Direct",
- "requested": "[2.0.230706.1, )",
- "resolved": "2.0.230706.1",
- "contentHash": "l0D7oCw/5X+xIKHqZTi62TtV+1qeSz7KVluNFdrJ9hXsst4ghvqQ/Yhura7JqRdZWBXAuDS0G0KwALptdoxweQ=="
- },
- "boost": {
- "type": "Transitive",
- "resolved": "1.83.0",
- "contentHash": "cy53VNMzysEMvhBixDe8ujPk67Fcj3v6FPHQnH91NYJNLHpc6jxa2xq9ruCaaJjE4M3YrGSHDi4uUSTGBWw6EQ=="
- },
- "Microsoft.Web.WebView2": {
- "type": "Transitive",
- "resolved": "1.0.1264.42",
- "contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
- },
- "common": {
- "type": "Project",
- "dependencies": {
- "boost": "[1.83.0, )"
- }
- },
- "fmt": {
- "type": "Project"
- },
- "folly": {
- "type": "Project",
- "dependencies": {
- "boost": "[1.83.0, )",
- "fmt": "[1.0.0, )"
- }
- },
- "microsoft.reactnative": {
- "type": "Project",
- "dependencies": {
- "Common": "[1.0.0, )",
- "Folly": "[1.0.0, )",
- "Microsoft.JavaScript.Hermes": "[0.1.23, )",
- "Microsoft.UI.Xaml": "[2.8.0, )",
- "ReactCommon": "[1.0.0, )",
- "boost": "[1.83.0, )"
- }
- },
- "reactcommon": {
- "type": "Project",
- "dependencies": {
- "Folly": "[1.0.0, )",
- "boost": "[1.83.0, )"
- }
- },
- "sliderwindows": {
- "type": "Project",
- "dependencies": {
- "Microsoft.ReactNative": "[1.0.0, )",
- "Microsoft.UI.Xaml": "[2.8.0, )"
- }
- }
- },
- "native,Version=v0.0/win10-arm": {
- "Microsoft.Web.WebView2": {
- "type": "Transitive",
- "resolved": "1.0.1264.42",
- "contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
- }
- },
- "native,Version=v0.0/win10-arm-aot": {
- "Microsoft.Web.WebView2": {
- "type": "Transitive",
- "resolved": "1.0.1264.42",
- "contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
- }
- },
- "native,Version=v0.0/win10-arm64-aot": {
- "Microsoft.Web.WebView2": {
- "type": "Transitive",
- "resolved": "1.0.1264.42",
- "contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
- }
- },
- "native,Version=v0.0/win10-x64": {
- "Microsoft.Web.WebView2": {
- "type": "Transitive",
- "resolved": "1.0.1264.42",
- "contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
- }
- },
- "native,Version=v0.0/win10-x64-aot": {
- "Microsoft.Web.WebView2": {
- "type": "Transitive",
- "resolved": "1.0.1264.42",
- "contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
- }
- },
- "native,Version=v0.0/win10-x86": {
- "Microsoft.Web.WebView2": {
- "type": "Transitive",
- "resolved": "1.0.1264.42",
- "contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
- }
- },
- "native,Version=v0.0/win10-x86-aot": {
- "Microsoft.Web.WebView2": {
- "type": "Transitive",
- "resolved": "1.0.1264.42",
- "contentHash": "7OBUTkzQ5VI/3gb0ufi5U4zjuCowAJwQg2li0zXXzqkM+S1kmOlivTy1R4jAW+gY5Vyg510M+qMAESCQUjrfgA=="
- }
- }
- }
-}
\ No newline at end of file
diff --git a/example/windows/example/pch.cpp b/example/windows/example/pch.cpp
deleted file mode 100644
index e0d2ef1a..00000000
--- a/example/windows/example/pch.cpp
+++ /dev/null
@@ -1 +0,0 @@
-#include "pch.h"
diff --git a/example/windows/example/pch.h b/example/windows/example/pch.h
deleted file mode 100644
index 54f954f4..00000000
--- a/example/windows/example/pch.h
+++ /dev/null
@@ -1,24 +0,0 @@
-#pragma once
-
-#define NOMINMAX
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-
-#include
-
-#include
-#include
-#include
-#include
-#include
-using namespace winrt::Windows::Foundation;
diff --git a/package/__test__/Slider.test.tsx b/package/__test__/Slider.test.tsx
deleted file mode 100644
index f2073126..00000000
--- a/package/__test__/Slider.test.tsx
+++ /dev/null
@@ -1,80 +0,0 @@
-import React from 'react';
-import {fireEvent, render} from '@testing-library/react-native';
-import Slider from '../src/Slider';
-
-describe('Slider', () => {
- it('Calls the given onValueChange when native event is emitted', () => {
- const onValueChange = jest.fn();
- const {getByTestId} = render(
- ,
- );
- const slider = getByTestId('slider');
- fireEvent(slider, 'change', {nativeEvent: {value: 2}});
- expect(onValueChange).toHaveBeenCalledWith(2);
- });
-
- it('Handles provided events when sliding starts is emitted', () => {
- const onSlidingStart = jest.fn();
- const {getByTestId} = render(
- ,
- );
- const slider = getByTestId('slider');
-
- fireEvent(slider, 'onRNCSliderSlidingStart', {nativeEvent: {value: 2}});
- expect(onSlidingStart).toHaveBeenCalledWith(2);
- });
-
- it('Handles provided events when sliding end is emitted', () => {
- const onSlidingComplete = jest.fn();
- const {getByTestId} = render(
- ,
- );
- const slider = getByTestId('slider');
-
- fireEvent(slider, 'onRNCSliderSlidingComplete', {nativeEvent: {value: 2}});
- expect(onSlidingComplete).toHaveBeenCalledWith(2);
- });
-
- it('Calls the accessibility handler when accessibility action is triggered', () => {
- const mockedAccessibilityHandler = jest.fn();
- const {getByTestId} = render(
- ,
- );
- const slider = getByTestId('slider');
-
- fireEvent(slider, 'onRNCSliderAccessibilityAction', {
- actionName: 'mocked-action',
- });
- expect(mockedAccessibilityHandler).toHaveBeenCalledWith({
- actionName: 'mocked-action',
- });
- });
-
- it('Emitts a warning in the dev console if lower and upper limits are switched', () => {
- const mockedWarn = jest.fn();
- console.warn = mockedWarn;
- render( );
- expect(mockedWarn).toHaveBeenCalled();
- });
-
- it('Provides the onLayout with the measured width', () => {
- const {getByTestId} = render( );
- const slider = getByTestId('slider');
- fireEvent(slider, 'onLayout', {nativeEvent: {layout: {width: 200}}});
- expect(slider).toHaveStyle({width: 200});
- });
-
- it('Prevents the gesture control from being released externally', () => {
- const mockedRelease = jest.fn();
- jest.mock('../src/index', () => ({
- ...jest.requireActual('../src/index'),
- onResponderRelease: mockedRelease,
- }));
- const {getByTestId} = render( );
- fireEvent(getByTestId('slider'), 'onResponderTerminationRequest');
- expect(mockedRelease).not.toHaveBeenCalled();
- });
-});
diff --git a/package/__test__/components/StepNumber.test.tsx b/package/__test__/components/StepNumber.test.tsx
deleted file mode 100644
index 92828c72..00000000
--- a/package/__test__/components/StepNumber.test.tsx
+++ /dev/null
@@ -1,12 +0,0 @@
-import React from 'react';
-import {render} from '@testing-library/react-native';
-import {StepNumber} from '../../src/components/StepNumber';
-
-describe('StepNumber', () => {
- it('Displays number of step according to given index', () => {
- const {getByText} = render(
- ,
- );
- expect(getByText('0')).toBeDefined();
- });
-});
diff --git a/package/__test__/components/StepsIndicator.test.tsx b/package/__test__/components/StepsIndicator.test.tsx
deleted file mode 100644
index 5f49a93f..00000000
--- a/package/__test__/components/StepsIndicator.test.tsx
+++ /dev/null
@@ -1,93 +0,0 @@
-import React from 'react';
-import {render} from '@testing-library/react-native';
-import {StepsIndicator} from '../../src/components/StepsIndicator';
-import {constants} from '../../src/utils/constants';
-import {Platform} from 'react-native';
-import {styles} from '../../src/utils/styles';
-
-const defaultOptions = [0, 1, 2, 3, 4, 5];
-const longerOptions = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
-
-describe('StepsIndicator', () => {
- it('Renders every step provided in options', () => {
- const {getByText} = render(
- ,
- );
- for (const step of defaultOptions) {
- expect(getByText(step.toString())).toBeDefined();
- }
- });
-
- it('Applies the big font size to the lower number of steps', () => {
- const {getByTestId} = render(
- ,
- );
- expect(getByTestId('0th-step')).toHaveStyle({
- fontSize: constants.STEP_NUMBER_TEXT_FONT_BIG,
- });
- });
-
- it('Applies the small font size to the number of steps higher than 9', () => {
- const {getByTestId} = render(
- ,
- );
- expect(getByTestId('0th-step')).toHaveStyle({
- fontSize: constants.STEP_NUMBER_TEXT_FONT_SMALL,
- });
- });
-
- it('Applies platform-dependent styles for web', () => {
- Platform.OS = 'web';
- const {getByTestId} = render(
- ,
- );
- expect(getByTestId('StepsIndicator-Container')).toHaveStyle(
- styles.stepsIndicator,
- );
- });
-
- it('Reverts given options when isLTR is set', () => {
- const {getByTestId} = render(
- ,
- );
- expect(getByTestId('0th-step')).toHaveTextContent('5');
- expect(getByTestId('2th-step')).toHaveTextContent('3');
- });
-
- it('Does not display any step numbers if prop is not set', () => {
- const {queryByTestId} = render(
- ,
- );
- expect(queryByTestId('0th-step')).toBeFalsy();
- });
-});
diff --git a/package/__test__/components/TrackMark.test.tsx b/package/__test__/components/TrackMark.test.tsx
deleted file mode 100644
index b2356879..00000000
--- a/package/__test__/components/TrackMark.test.tsx
+++ /dev/null
@@ -1,41 +0,0 @@
-import React from 'react';
-import {render} from '@testing-library/react-native';
-import {MarkerProps, SliderTrackMark} from '../../src/components/TrackMark';
-import {View} from 'react-native';
-
-const MockedStepMarker = ({}: MarkerProps) => (
-
-);
-
-const MockedThumbImage = 1;
-
-describe('TrackMark', () => {
- it('Renders the StepMarker if custom component is given', () => {
- const {getByTestId} = render(
- ,
- );
- expect(getByTestId('mockedStepMarker')).toBeDefined();
- });
-
- it('Renders the StepMarker with thumbImage if provided', () => {
- const {getByTestId} = render(
- ,
- );
- expect(getByTestId('sliderTrackMark-thumbImage')).toBeDefined();
- });
-});
diff --git a/package/__tests__/Slider.test.tsx b/package/__tests__/Slider.test.tsx
new file mode 100644
index 00000000..77d6a76c
--- /dev/null
+++ b/package/__tests__/Slider.test.tsx
@@ -0,0 +1,135 @@
+import React from 'react';
+import {fireEvent, render} from '@testing-library/react-native';
+import {Text} from 'react-native';
+
+import Slider, {type MarkerProps} from '../src/Slider';
+
+describe('Slider', () => {
+ it('maps public value props to native prop names', () => {
+ const {getByTestId} = render(
+ ,
+ );
+
+ expect(getByTestId('slider')).toHaveProp('minValue', 2);
+ expect(getByTestId('slider')).toHaveProp('maxValue', 10);
+ expect(getByTestId('slider')).toHaveProp('lowerLimit', 3);
+ expect(getByTestId('slider')).toHaveProp('upperLimit', 9);
+ expect(getByTestId('slider')).toHaveProp('value', 4);
+ expect(getByTestId('slider')).toHaveProp('step', 2);
+ expect(getByTestId('slider')).toHaveProp('disabled', true);
+ expect(getByTestId('slider')).toHaveProp('inverted', true);
+ expect(getByTestId('slider')).toHaveProp('tapToSeek', true);
+ expect(getByTestId('slider')).toHaveProp('thumbTintColor', 'red');
+ });
+
+ it('keeps minValue and maxValue as compatibility aliases', () => {
+ const {getByTestId} = render(
+ ,
+ );
+
+ expect(getByTestId('slider')).toHaveProp('minValue', 5);
+ expect(getByTestId('slider')).toHaveProp('maxValue', 15);
+ });
+
+ it('forwards native value events with numeric values', () => {
+ const onValueChange = jest.fn();
+ const onSlidingStart = jest.fn();
+ const onSlidingComplete = jest.fn();
+ const {getByTestId} = render(
+ ,
+ );
+
+ fireEvent(getByTestId('slider'), 'onValueChange', {
+ nativeEvent: {value: 0.25},
+ });
+ fireEvent(getByTestId('slider'), 'onSlidingStart', {
+ nativeEvent: {value: 0.5},
+ });
+ fireEvent(getByTestId('slider'), 'onSlidingComplete', {
+ nativeEvent: {value: 0.75},
+ });
+
+ expect(onValueChange).toHaveBeenCalledWith(0.25);
+ expect(onSlidingStart).toHaveBeenCalledWith(0.5);
+ expect(onSlidingComplete).toHaveBeenCalledWith(0.75);
+ });
+
+ it('passes accessibility actions through unchanged', () => {
+ const onAccessibilityAction = jest.fn();
+ const event = {nativeEvent: {actionName: 'increment'}};
+ const {getByTestId} = render(
+ ,
+ );
+
+ fireEvent(getByTestId('slider'), 'onAccessibilityAction', event);
+
+ expect(onAccessibilityAction).toHaveBeenCalledWith(event);
+ });
+
+ it('warns when lowerLimit is greater than upperLimit', () => {
+ const warn = jest.spyOn(console, 'warn').mockImplementation(() => {});
+
+ render( );
+
+ expect(warn).toHaveBeenCalledWith(
+ 'Invalid configuration: lower limit is supposed to be smaller than upper limit',
+ );
+
+ warn.mockRestore();
+ });
+
+ it('renders step numbers and custom markers', () => {
+ const StepMarker = jest.fn(({index, stepMarked}: MarkerProps) => (
+ {stepMarked ? 'selected' : 'idle'}
+ ));
+
+ const {getByTestId} = render(
+ ,
+ );
+
+ expect(getByTestId('StepsIndicator-Container')).toBeTruthy();
+ expect(getByTestId('0th-step')).toHaveTextContent('0');
+ expect(getByTestId('1th-step')).toHaveTextContent('1');
+ expect(getByTestId('2th-step')).toHaveTextContent('2');
+ expect(getByTestId('marker-1')).toHaveTextContent('selected');
+ expect(getByTestId('slider')).toHaveProp('thumbTintColor', 'transparent');
+ expect(StepMarker).toHaveBeenCalledWith(
+ expect.objectContaining({
+ currentValue: 1,
+ index: 1,
+ max: 2,
+ min: 0,
+ stepMarked: true,
+ }),
+ undefined,
+ );
+ });
+});
diff --git a/package/android/build.gradle b/package/android/build.gradle
index 362ad4a5..5744ce1f 100644
--- a/package/android/build.gradle
+++ b/package/android/build.gradle
@@ -9,18 +9,28 @@ buildscript {
classpath("com.android.tools.build:gradle:7.1.1")
classpath("com.facebook.react:react-native-gradle-plugin")
classpath("de.undercouch:gradle-download-task:5.0.1")
+ classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:2.1.20")
}
}
+plugins {
+ id 'org.jetbrains.kotlin.plugin.compose' version '2.1.20'
+}
+
apply plugin: 'com.android.library'
+apply plugin: 'org.jetbrains.kotlin.android'
apply plugin: 'com.facebook.react'
def getExtOrDefault(name) {
- return rootProject.ext.has(name) ? rootProject.ext.get(name) : project.properties['ReactNativeSlider_' + name]
+ return rootProject.ext.has(name)
+ ? rootProject.ext.get(name)
+ : project.properties['ReactNativeSlider_' + name]
}
def getExtOrIntegerDefault(name) {
- return rootProject.ext.has(name) ? rootProject.ext.get(name) : (project.properties['ReactNativeSlider_' + name]).toInteger()
+ return rootProject.ext.has(name)
+ ? rootProject.ext.get(name)
+ : (project.properties['ReactNativeSlider_' + name]).toInteger()
}
android {
@@ -30,9 +40,14 @@ android {
def major = agpVersion[0].toInteger()
def minor = agpVersion[1].toInteger()
if ((major == 7 && minor >= 3) || major >= 8) {
- namespace "com.reactnativecommunity.slider"
+ namespace "com.callstack.slider"
buildFeatures {
buildConfig true
+ compose true
+ }
+ } else {
+ buildFeatures {
+ compose true
}
}
@@ -59,5 +74,15 @@ repositories {
dependencies {
//noinspection GradleDynamicVersion
api 'com.facebook.react:react-native:+'
-}
+ implementation 'org.jetbrains.kotlin:kotlin-stdlib'
+ implementation platform('androidx.compose:compose-bom:2025.02.00')
+ implementation 'androidx.compose.ui:ui'
+ implementation 'androidx.compose.material3:material3'
+ implementation 'androidx.compose.ui:ui-tooling-preview'
+ debugImplementation 'androidx.compose.ui:ui-tooling'
+ implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.9.0'
+
+ implementation 'com.facebook.react:react-android'
+ implementation 'androidx.activity:activity-compose:1.8.2'
+}
diff --git a/package/android/gradle.properties b/package/android/gradle.properties
index cdf09fb3..d7ade578 100644
--- a/package/android/gradle.properties
+++ b/package/android/gradle.properties
@@ -1,4 +1,4 @@
-ReactNativeSlider_compileSdkVersion=30
-ReactNativeSlider_buildToolsVersion=30.0.0
-ReactNativeSlider_targetSdkVersion=30
-ReactNativeSlider_minSdkVersion=21
+ReactNativeSlider_compileSdkVersion=36
+ReactNativeSlider_buildToolsVersion=36.0.0
+ReactNativeSlider_targetSdkVersion=36
+ReactNativeSlider_minSdkVersion=24
diff --git a/package/android/gradle/wrapper/gradle-wrapper.jar b/package/android/gradle/wrapper/gradle-wrapper.jar
deleted file mode 100644
index f6b961fd..00000000
Binary files a/package/android/gradle/wrapper/gradle-wrapper.jar and /dev/null differ
diff --git a/package/android/gradle/wrapper/gradle-wrapper.properties b/package/android/gradle/wrapper/gradle-wrapper.properties
deleted file mode 100644
index 862a5356..00000000
--- a/package/android/gradle/wrapper/gradle-wrapper.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#Sat Feb 09 14:36:05 CET 2019
-distributionBase=GRADLE_USER_HOME
-distributionPath=wrapper/dists
-zipStoreBase=GRADLE_USER_HOME
-zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip
diff --git a/package/android/gradlew b/package/android/gradlew
deleted file mode 100644
index cccdd3d5..00000000
--- a/package/android/gradlew
+++ /dev/null
@@ -1,172 +0,0 @@
-#!/usr/bin/env sh
-
-##############################################################################
-##
-## Gradle start up script for UN*X
-##
-##############################################################################
-
-# Attempt to set APP_HOME
-# Resolve links: $0 may be a link
-PRG="$0"
-# Need this for relative symlinks.
-while [ -h "$PRG" ] ; do
- ls=`ls -ld "$PRG"`
- link=`expr "$ls" : '.*-> \(.*\)$'`
- if expr "$link" : '/.*' > /dev/null; then
- PRG="$link"
- else
- PRG=`dirname "$PRG"`"/$link"
- fi
-done
-SAVED="`pwd`"
-cd "`dirname \"$PRG\"`/" >/dev/null
-APP_HOME="`pwd -P`"
-cd "$SAVED" >/dev/null
-
-APP_NAME="Gradle"
-APP_BASE_NAME=`basename "$0"`
-
-# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
-DEFAULT_JVM_OPTS=""
-
-# Use the maximum available, or set MAX_FD != -1 to use that value.
-MAX_FD="maximum"
-
-warn () {
- echo "$*"
-}
-
-die () {
- echo
- echo "$*"
- echo
- exit 1
-}
-
-# 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
- ;;
- 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"
- which java >/dev/null 2>&1 || 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
-
-# Increase the maximum file descriptors if we can.
-if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
- MAX_FD_LIMIT=`ulimit -H -n`
- if [ $? -eq 0 ] ; then
- if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
- MAX_FD="$MAX_FD_LIMIT"
- fi
- ulimit -n $MAX_FD
- if [ $? -ne 0 ] ; then
- warn "Could not set maximum file descriptor limit: $MAX_FD"
- fi
- else
- warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
- fi
-fi
-
-# For Darwin, add options to specify how the application appears in the dock
-if $darwin; then
- GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
-fi
-
-# For Cygwin, switch paths to Windows format before running java
-if $cygwin ; then
- APP_HOME=`cygpath --path --mixed "$APP_HOME"`
- CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
- JAVACMD=`cygpath --unix "$JAVACMD"`
-
- # We build the pattern for arguments to be converted via cygpath
- ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
- SEP=""
- for dir in $ROOTDIRSRAW ; do
- ROOTDIRS="$ROOTDIRS$SEP$dir"
- SEP="|"
- done
- OURCYGPATTERN="(^($ROOTDIRS))"
- # Add a user-defined pattern to the cygpath arguments
- if [ "$GRADLE_CYGPATTERN" != "" ] ; then
- OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
- fi
- # Now convert the arguments - kludge to limit ourselves to /bin/sh
- i=0
- for arg in "$@" ; do
- CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
- CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
-
- if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
- eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
- else
- eval `echo args$i`="\"$arg\""
- fi
- i=$((i+1))
- done
- case $i in
- (0) set -- ;;
- (1) set -- "$args0" ;;
- (2) set -- "$args0" "$args1" ;;
- (3) set -- "$args0" "$args1" "$args2" ;;
- (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
- (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
- (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
- (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
- (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
- (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
- esac
-fi
-
-# Escape application args
-save () {
- for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
- echo " "
-}
-APP_ARGS=$(save "$@")
-
-# Collect all arguments for the java command, following the shell quoting and substitution rules
-eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
-
-# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
-if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
- cd "$(dirname "$0")"
-fi
-
-exec "$JAVACMD" "$@"
diff --git a/package/android/gradlew.bat b/package/android/gradlew.bat
deleted file mode 100644
index e95643d6..00000000
--- a/package/android/gradlew.bat
+++ /dev/null
@@ -1,84 +0,0 @@
-@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=.
-set APP_BASE_NAME=%~n0
-set APP_HOME=%DIRNAME%
-
-@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=
-
-@rem Find java.exe
-if defined JAVA_HOME goto findJavaFromJavaHome
-
-set JAVA_EXE=java.exe
-%JAVA_EXE% -version >NUL 2>&1
-if "%ERRORLEVEL%" == "0" goto init
-
-echo.
-echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:findJavaFromJavaHome
-set JAVA_HOME=%JAVA_HOME:"=%
-set JAVA_EXE=%JAVA_HOME%/bin/java.exe
-
-if exist "%JAVA_EXE%" goto init
-
-echo.
-echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
-echo.
-echo Please set the JAVA_HOME variable in your environment to match the
-echo location of your Java installation.
-
-goto fail
-
-:init
-@rem Get command-line arguments, handling Windows variants
-
-if not "%OS%" == "Windows_NT" goto win9xME_args
-
-:win9xME_args
-@rem Slurp the command line arguments.
-set CMD_LINE_ARGS=
-set _SKIP=2
-
-:win9xME_args_slurp
-if "x%~1" == "x" goto execute
-
-set CMD_LINE_ARGS=%*
-
-: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 %CMD_LINE_ARGS%
-
-:end
-@rem End local scope for the variables with windows NT shell
-if "%ERRORLEVEL%"=="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!
-if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
-exit /b 1
-
-:mainEnd
-if "%OS%"=="Windows_NT" endlocal
-
-:omega
diff --git a/package/android/src/main/AndroidManifest.xml b/package/android/src/main/AndroidManifest.xml
index f8c7bb80..a2f47b60 100644
--- a/package/android/src/main/AndroidManifest.xml
+++ b/package/android/src/main/AndroidManifest.xml
@@ -1,3 +1,2 @@
-
-
\ No newline at end of file
+
+
diff --git a/package/android/src/main/java/com/callstack/slider/InlineComposeView.kt b/package/android/src/main/java/com/callstack/slider/InlineComposeView.kt
new file mode 100644
index 00000000..f52c8615
--- /dev/null
+++ b/package/android/src/main/java/com/callstack/slider/InlineComposeView.kt
@@ -0,0 +1,114 @@
+package com.callstack.slider
+
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.Recomposer
+import androidx.compose.ui.platform.AbstractComposeView
+import androidx.compose.ui.platform.AndroidUiDispatcher
+import androidx.compose.ui.platform.ViewCompositionStrategy
+import androidx.compose.ui.platform.compositionContext
+import androidx.lifecycle.Lifecycle
+import androidx.lifecycle.LifecycleOwner
+import androidx.lifecycle.LifecycleRegistry
+import androidx.lifecycle.setViewTreeLifecycleOwner
+import androidx.savedstate.SavedStateRegistry
+import androidx.savedstate.SavedStateRegistryController
+import androidx.savedstate.SavedStateRegistryOwner
+import androidx.savedstate.setViewTreeSavedStateRegistryOwner
+import com.facebook.react.uimanager.ThemedReactContext
+import com.facebook.react.uimanager.UIManagerHelper
+import com.facebook.react.uimanager.events.Event
+import com.facebook.react.uimanager.events.EventDispatcher
+import kotlinx.coroutines.CoroutineScope
+import kotlinx.coroutines.cancel
+import kotlinx.coroutines.launch
+
+abstract class RNCustomRenderComposeView(
+ protected val reactContext: ThemedReactContext,
+) : AbstractComposeView(reactContext), LifecycleOwner, SavedStateRegistryOwner {
+
+ private val lifecycleRegistry = LifecycleRegistry(this)
+ private val savedStateRegistryController = SavedStateRegistryController.create(this)
+
+ override val lifecycle: Lifecycle get() = lifecycleRegistry
+ override val savedStateRegistry: SavedStateRegistry
+ get() = savedStateRegistryController.savedStateRegistry
+
+ private var recomposerScope: CoroutineScope? = null
+
+ var eventDispatcher: EventDispatcher? = null
+
+ @Composable
+ abstract fun ComposeContent()
+
+ @Composable
+ override fun Content() {
+ ComposeContent()
+ }
+
+ init {
+ savedStateRegistryController.performRestore(null)
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
+ setViewCompositionStrategy(
+ ViewCompositionStrategy.DisposeOnLifecycleDestroyed(lifecycle),
+ )
+ ensureRecomposer()
+ }
+
+ override fun onAttachedToWindow() {
+ ensureRecomposer()
+ resumeLifecycle()
+ super.onAttachedToWindow()
+ }
+
+ override fun onDetachedFromWindow() {
+ pauseLifecycle()
+ super.onDetachedFromWindow()
+ }
+
+ open fun onDropInstance() {
+ eventDispatcher = null
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY)
+ recomposerScope?.cancel()
+ recomposerScope = null
+ }
+
+ protected fun dispatchEvent(event: Event<*>) {
+ val dispatcher = eventDispatcher ?: return
+ post {
+ dispatcher.dispatchEvent(event)
+ }
+ }
+
+ protected fun getSurfaceId(): Int = UIManagerHelper.getSurfaceId(this)
+
+ private fun ensureRecomposer() {
+ if (recomposerScope != null) return
+
+ setViewTreeLifecycleOwner(this)
+ setViewTreeSavedStateRegistryOwner(this)
+
+ val scope = CoroutineScope(AndroidUiDispatcher.CurrentThread)
+ recomposerScope = scope
+ val recomposer = Recomposer(scope.coroutineContext)
+ scope.launch { recomposer.runRecomposeAndApplyChanges() }
+ compositionContext = recomposer
+ }
+
+ private fun resumeLifecycle() {
+ when (lifecycleRegistry.currentState) {
+ Lifecycle.State.CREATED -> {
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START)
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
+ }
+ Lifecycle.State.STARTED ->
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME)
+ else -> Unit
+ }
+ }
+
+ private fun pauseLifecycle() {
+ if (lifecycleRegistry.currentState == Lifecycle.State.DESTROYED) return
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE)
+ lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP)
+ }
+}
diff --git a/package/android/src/main/java/com/callstack/slider/ReactSliderPackage.kt b/package/android/src/main/java/com/callstack/slider/ReactSliderPackage.kt
new file mode 100644
index 00000000..16906aaa
--- /dev/null
+++ b/package/android/src/main/java/com/callstack/slider/ReactSliderPackage.kt
@@ -0,0 +1,15 @@
+package com.callstack.slider
+
+import com.facebook.react.ReactPackage
+import com.facebook.react.bridge.NativeModule
+import com.facebook.react.bridge.ReactApplicationContext
+import com.facebook.react.uimanager.ViewManager
+
+class SliderPackage : ReactPackage {
+ override fun createNativeModules(reactContext: ReactApplicationContext): List =
+ emptyList()
+
+ override fun createViewManagers(
+ reactContext: ReactApplicationContext,
+ ): List> = listOf(SliderViewManager())
+}
diff --git a/package/android/src/main/java/com/callstack/slider/SliderEvents.kt b/package/android/src/main/java/com/callstack/slider/SliderEvents.kt
new file mode 100644
index 00000000..f21edd58
--- /dev/null
+++ b/package/android/src/main/java/com/callstack/slider/SliderEvents.kt
@@ -0,0 +1,50 @@
+package com.callstack.slider
+
+import com.facebook.react.bridge.Arguments
+import com.facebook.react.bridge.WritableMap
+import com.facebook.react.uimanager.events.Event
+
+class ValueChangedEvent(surfaceId: Int, viewId: Int, private val value: Float) :
+ Event(surfaceId, viewId) {
+
+ override fun getEventName(): String = EVENT_NAME
+
+ override fun getEventData(): WritableMap =
+ Arguments.createMap().apply {
+ putDouble("value", value.toDouble())
+ }
+
+ companion object {
+ const val EVENT_NAME = "topValueChange"
+ }
+}
+
+class SlidingStartEvent(surfaceId: Int, viewId: Int, private val value: Float) :
+ Event(surfaceId, viewId) {
+
+ override fun getEventName(): String = EVENT_NAME
+
+ override fun getEventData(): WritableMap =
+ Arguments.createMap().apply {
+ putDouble("value", value.toDouble())
+ }
+
+ companion object {
+ const val EVENT_NAME = "topSlidingStart"
+ }
+}
+
+class SlidingCompleteEvent(surfaceId: Int, viewId: Int, private val value: Float) :
+ Event(surfaceId, viewId) {
+
+ override fun getEventName(): String = EVENT_NAME
+
+ override fun getEventData(): WritableMap =
+ Arguments.createMap().apply {
+ putDouble("value", value.toDouble())
+ }
+
+ companion object {
+ const val EVENT_NAME = "topSlidingComplete"
+ }
+}
diff --git a/package/android/src/main/java/com/callstack/slider/SliderView.kt b/package/android/src/main/java/com/callstack/slider/SliderView.kt
new file mode 100644
index 00000000..8b669fb3
--- /dev/null
+++ b/package/android/src/main/java/com/callstack/slider/SliderView.kt
@@ -0,0 +1,166 @@
+package com.callstack.slider
+
+import androidx.compose.foundation.interaction.MutableInteractionSource
+import androidx.compose.material3.ExperimentalMaterial3Api
+import androidx.compose.material3.Slider
+import androidx.compose.material3.SliderDefaults
+import androidx.compose.runtime.CompositionLocalProvider
+import androidx.compose.runtime.Composable
+import androidx.compose.runtime.mutableStateOf
+import androidx.compose.runtime.remember
+import androidx.compose.ui.graphics.Color
+import androidx.compose.ui.platform.LocalLayoutDirection
+import androidx.compose.ui.unit.DpSize
+import androidx.compose.ui.unit.LayoutDirection
+import androidx.compose.ui.unit.dp
+import com.facebook.react.uimanager.ThemedReactContext
+import kotlin.math.max
+import kotlin.math.min
+
+@OptIn(ExperimentalMaterial3Api::class)
+internal class SliderView(reactContext: ThemedReactContext) :
+ RNCustomRenderComposeView(reactContext) {
+
+ private val minValue = mutableStateOf(0f)
+ private val maxValue = mutableStateOf(1f)
+ private val steps = mutableStateOf(0)
+ private val sliderValue = mutableStateOf(0f)
+ private val lowerLimit = mutableStateOf(Float.NEGATIVE_INFINITY)
+ private val upperLimit = mutableStateOf(Float.POSITIVE_INFINITY)
+ private val disabled = mutableStateOf(false)
+ private val inverted = mutableStateOf(false)
+ private val minimumTrackTintColor = mutableStateOf(null)
+ private val maximumTrackTintColor = mutableStateOf(null)
+ private val thumbTintColor = mutableStateOf(null)
+ private val thumbSize = mutableStateOf(0f)
+ private var isSliding = false
+
+ fun setMinValue(value: Float) {
+ minValue.value = value
+ normalizeRange()
+ clampSliderValue()
+ }
+
+ fun setMaxValue(value: Float) {
+ maxValue.value = value
+ normalizeRange()
+ clampSliderValue()
+ }
+
+ fun setStep(value: Double) {
+ steps.value = max(value.toInt(), 0)
+ }
+
+ fun setValue(value: Float) {
+ sliderValue.value = clampedValue(value)
+ }
+
+ fun setLowerLimit(value: Float) {
+ lowerLimit.value = value
+ clampSliderValue()
+ }
+
+ fun setUpperLimit(value: Float) {
+ upperLimit.value = value
+ clampSliderValue()
+ }
+
+ fun setDisabled(value: Boolean) {
+ disabled.value = value
+ }
+
+ fun setInverted(value: Boolean) {
+ inverted.value = value
+ }
+
+ fun setMinimumTrackTintColor(value: Int?) {
+ minimumTrackTintColor.value = value
+ }
+
+ fun setMaximumTrackTintColor(value: Int?) {
+ maximumTrackTintColor.value = value
+ }
+
+ fun setThumbTintColor(value: Int?) {
+ thumbTintColor.value = value
+ }
+
+ fun setThumbSize(value: Float) {
+ thumbSize.value = max(value, 0f)
+ }
+
+ @Composable
+ override fun ComposeContent() {
+ val interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }
+ val layoutDirection =
+ if (inverted.value) {
+ LayoutDirection.Rtl
+ } else {
+ LayoutDirection.Ltr
+ }
+ val sliderColors = SliderDefaults.colors(
+ thumbColor = thumbTintColor.value?.let { Color(it) } ?: Color.Unspecified,
+ activeTrackColor = minimumTrackTintColor.value?.let { Color(it) } ?: Color.Unspecified,
+ inactiveTrackColor = maximumTrackTintColor.value?.let { Color(it) } ?: Color.Unspecified,
+ )
+
+ CompositionLocalProvider(LocalLayoutDirection provides layoutDirection) {
+ Slider(
+ value = sliderValue.value,
+ onValueChange = {
+ if (!isSliding) {
+ isSliding = true
+ dispatchEvent(SlidingStartEvent(getSurfaceId(), id, sliderValue.value))
+ }
+
+ val nextValue = clampedValue(it)
+ sliderValue.value = nextValue
+ dispatchEvent(ValueChangedEvent(getSurfaceId(), id, nextValue))
+ },
+ onValueChangeFinished = {
+ if (isSliding) {
+ isSliding = false
+ dispatchEvent(SlidingCompleteEvent(getSurfaceId(), id, sliderValue.value))
+ }
+ },
+ steps = steps.value,
+ valueRange = minValue.value..maxValue.value,
+ enabled = !disabled.value,
+ interactionSource = interactionSource,
+ colors = sliderColors,
+ thumb = {
+ if (thumbSize.value > 0f) {
+ SliderDefaults.Thumb(
+ interactionSource = interactionSource,
+ colors = sliderColors,
+ enabled = !disabled.value,
+ thumbSize = DpSize(thumbSize.value.dp, thumbSize.value.dp),
+ )
+ } else {
+ SliderDefaults.Thumb(
+ interactionSource = interactionSource,
+ colors = sliderColors,
+ enabled = !disabled.value,
+ )
+ }
+ },
+ )
+ }
+ }
+
+ private fun normalizeRange() {
+ if (maxValue.value < minValue.value) {
+ maxValue.value = minValue.value
+ }
+ }
+
+ private fun clampSliderValue() {
+ sliderValue.value = clampedValue(sliderValue.value)
+ }
+
+ private fun clampedValue(value: Float): Float {
+ val lower = max(minValue.value, lowerLimit.value)
+ val upper = min(maxValue.value, upperLimit.value)
+ return min(max(value, lower), max(lower, upper))
+ }
+}
diff --git a/package/android/src/main/java/com/callstack/slider/SliderViewManager.kt b/package/android/src/main/java/com/callstack/slider/SliderViewManager.kt
new file mode 100644
index 00000000..0b23485f
--- /dev/null
+++ b/package/android/src/main/java/com/callstack/slider/SliderViewManager.kt
@@ -0,0 +1,103 @@
+package com.callstack.slider
+
+import com.facebook.react.bridge.ReadableArray
+import com.facebook.react.bridge.ReadableMap
+import com.facebook.react.module.annotations.ReactModule
+import com.facebook.react.uimanager.SimpleViewManager
+import com.facebook.react.uimanager.ThemedReactContext
+import com.facebook.react.uimanager.UIManagerHelper
+import com.facebook.react.uimanager.ViewManagerDelegate
+import com.facebook.react.viewmanagers.SliderViewManagerDelegate
+import com.facebook.react.viewmanagers.SliderViewManagerInterface
+
+@ReactModule(name = SliderViewManager.NAME)
+internal class SliderViewManager :
+ SimpleViewManager(),
+ SliderViewManagerInterface {
+
+ private val delegate: ViewManagerDelegate =
+ SliderViewManagerDelegate(this)
+
+ override fun getName(): String = NAME
+
+ override fun createViewInstance(context: ThemedReactContext): SliderView = SliderView(context)
+
+ override fun getDelegate(): ViewManagerDelegate = delegate
+
+ override fun onDropViewInstance(view: SliderView) {
+ super.onDropViewInstance(view)
+ view.onDropInstance()
+ }
+
+ override fun setStep(view: SliderView, value: Double) {
+ view.setStep(value)
+ }
+
+ override fun setMinValue(view: SliderView, value: Double) {
+ view.setMinValue(value.toFloat())
+ }
+
+ override fun setMaxValue(view: SliderView, value: Double) {
+ view.setMaxValue(value.toFloat())
+ }
+
+ override fun setValue(view: SliderView, value: Float) {
+ view.setValue(value)
+ }
+
+ override fun setLowerLimit(view: SliderView, value: Float) {
+ view.setLowerLimit(value)
+ }
+
+ override fun setUpperLimit(view: SliderView, value: Float) {
+ view.setUpperLimit(value)
+ }
+
+ override fun setDisabled(view: SliderView, value: Boolean) {
+ view.setDisabled(value)
+ }
+
+ override fun setInverted(view: SliderView, value: Boolean) {
+ view.setInverted(value)
+ }
+
+ override fun setTapToSeek(view: SliderView, value: Boolean) = Unit
+
+ override fun setMinimumTrackTintColor(view: SliderView, value: Int?) {
+ view.setMinimumTrackTintColor(value)
+ }
+
+ override fun setMaximumTrackTintColor(view: SliderView, value: Int?) {
+ view.setMaximumTrackTintColor(value)
+ }
+
+ override fun setThumbTintColor(view: SliderView, value: Int?) {
+ view.setThumbTintColor(value)
+ }
+
+ override fun setThumbSize(view: SliderView, value: Float) {
+ view.setThumbSize(value)
+ }
+
+ override fun setVertical(view: SliderView, value: Boolean) = Unit
+
+ override fun setAccessibilityUnits(view: SliderView, value: String?) = Unit
+
+ override fun setAccessibilityIncrements(view: SliderView, value: ReadableArray?) = Unit
+
+ override fun setMaximumTrackImage(view: SliderView, value: ReadableMap?) = Unit
+
+ override fun setMinimumTrackImage(view: SliderView, value: ReadableMap?) = Unit
+
+ override fun setThumbImage(view: SliderView, value: ReadableMap?) = Unit
+
+ override fun setTrackImage(view: SliderView, value: ReadableMap?) = Unit
+
+ override fun addEventEmitters(reactContext: ThemedReactContext, view: SliderView) {
+ view.eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, view.id)
+ }
+
+ companion object {
+ const val NAME = "SliderView"
+ }
+}
diff --git a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlider.java b/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlider.java
deleted file mode 100644
index 19808941..00000000
--- a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlider.java
+++ /dev/null
@@ -1,398 +0,0 @@
-package com.reactnativecommunity.slider;
-
-import android.content.Context;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
-import android.graphics.PorterDuff;
-import android.graphics.drawable.BitmapDrawable;
-import android.os.Build;
-import android.util.Log;
-import android.util.AttributeSet;
-import android.view.accessibility.AccessibilityEvent;
-import android.view.accessibility.AccessibilityManager;
-import androidx.appcompat.widget.AppCompatSeekBar;
-
-import java.net.URL;
-import java.util.List;
-import java.util.Timer;
-import java.util.TimerTask;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import javax.annotation.Nullable;
-import com.facebook.react.modules.i18nmanager.I18nUtil;
-/**
- * Slider that behaves more like the iOS one, for consistency.
- *
- * On iOS, the value is 0..1. Android SeekBar only supports integer values. For consistency, we
- * pretend in JS that the value is 0..1 but set the SeekBar value to 0..100.
- *
- *
Note that the slider is _not_ a controlled component (setValue isn't called during dragging).
- */
-public class ReactSlider extends AppCompatSeekBar {
-
- /**
- * If step is 0 (unset) we default to this total number of steps. Don't use 100 which leads to
- * rounding errors (0.200000000001).
- */
- private static int DEFAULT_TOTAL_STEPS = 128;
-
- /**
- * We want custom min..max range. Android only supports 0..max range so we implement this
- * ourselves.
- */
- private double mMinValue = 0;
-
- private double mMaxValue = 0;
-
- /**
- * Value sent from JS (setState). Doesn't get updated during drag (slider is not a controlled
- * component).
- */
- private double mValue = 0;
-
- private boolean isSliding = false;
-
- /** If zero it's determined automatically. */
- private double mStep = 0;
-
- private double mStepCalculated = 0;
-
- private String mAccessibilityUnits;
-
- private List mAccessibilityIncrements;
-
- /** Real limit value based on min and max values. This comes from props */
- private double mRealLowerLimit = Long.MIN_VALUE;
-
- /** Lower limit based on the SeekBar progress 0..total steps */
- private int mLowerLimit;
-
- /** Real limit value based on min and max values. This comes from props */
- private double mRealUpperLimit = Long.MAX_VALUE;
-
- /** Upper limit based on the SeekBar progress 0..total steps */
- private int mUpperLimit;
-
- /** Thumb size in pixels (0 = default) */
- private int mThumbSizePx = 0;
-
- /** Original thumb drawable URI */
- @Nullable private String mThumbImageUri = null;
-
- /** Cached thumb tint color */
- @Nullable private Integer mThumbTintColor = null;
-
- public ReactSlider(Context context, @Nullable AttributeSet attrs) {
- super(context, attrs);
- I18nUtil sharedI18nUtilInstance = I18nUtil.getInstance();
- super.setLayoutDirection(sharedI18nUtilInstance.isRTL(context) ? LAYOUT_DIRECTION_RTL : LAYOUT_DIRECTION_LTR);
- disableStateListAnimatorIfNeeded();
- }
-
- private void disableStateListAnimatorIfNeeded() {
- // We disable the state list animator for Android 6 and 7; this is a hack to prevent T37452851
- // and https://github.com/facebook/react-native/issues/9979
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M
- && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
- super.setStateListAnimator(null);
- }
- }
-
- /* package */ void setMaxValue(double max) {
- mMaxValue = max;
- updateAll();
- }
-
- /* package */ void setMinValue(double min) {
- mMinValue = min;
- updateAll();
- }
-
- /*package*/ int getValidProgressValue(int progress) {
- if (progress < getLowerLimit()) {
- progress = getLowerLimit();
- } else if (progress > getUpperLimit()) {
- progress = getUpperLimit();
- }
- return progress;
- }
-
- /* package */ void setValue(double value) {
- mValue = value;
- updateValue();
- }
-
- /* package */ void setStep(double step) {
- mStep = step;
- updateAll();
- }
-
- /* package */ void setLowerLimit(double value) {
- mRealLowerLimit = value;
- updateLowerLimit();
- }
-
- /* package */ void setUpperLimit(double value) {
- mRealUpperLimit = value;
- updateUpperLimit();
- }
-
- int getLowerLimit() {
- return this.mLowerLimit;
- }
-
- int getUpperLimit() {
- return this.mUpperLimit;
- }
-
- boolean isSliding() {
- return isSliding;
- }
-
- void isSliding(boolean isSliding) {
- this.isSliding = isSliding;
- }
-
- void setAccessibilityUnits(String accessibilityUnits) {
- mAccessibilityUnits = accessibilityUnits;
- }
-
- void setAccessibilityIncrements(List accessibilityIncrements) {
- mAccessibilityIncrements = accessibilityIncrements;
- }
-
- @Override
- public void onPopulateAccessibilityEvent(AccessibilityEvent event) {
- super.onPopulateAccessibilityEvent(event);
-
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- if (event.getEventType() == AccessibilityEvent.TYPE_VIEW_ACCESSIBILITY_FOCUSED ||
- (event.getEventType() == AccessibilityEvent.TYPE_VIEW_SELECTED && this.isAccessibilityFocused())) {
- this.setupAccessibility((int)mValue);
- }
- }
- }
-
- @Override
- public void announceForAccessibility(CharSequence text) {
- Context ctx = this.getContext();
- final AccessibilityManager manager = (AccessibilityManager) ctx.getSystemService(Context.ACCESSIBILITY_SERVICE);
-
- if (manager.isEnabled()) {
- final AccessibilityEvent e = AccessibilityEvent.obtain();
- e.setEventType(AccessibilityEvent.TYPE_ANNOUNCEMENT);
- e.setClassName(this.getClass().getName());
- e.setPackageName(ctx.getPackageName());
- e.getText().add(text);
-
- TimerTask task = new TimerTask() {
- @Override
- public void run() {
- manager.sendAccessibilityEvent(e);
- }
- };
-
- Timer timer = new Timer();
- timer.schedule(task, 1000);
- }
- }
-
- public void setupAccessibility(int index) {
- if (mAccessibilityUnits != null && mAccessibilityIncrements != null && mAccessibilityIncrements.size() - 1 == (int)mMaxValue) {
- String sliderValue = mAccessibilityIncrements.get(index);
- int stringLength = mAccessibilityUnits.length();
-
- String spokenUnits = mAccessibilityUnits;
- if (sliderValue != null && Integer.parseInt(sliderValue) == 1) {
- spokenUnits = spokenUnits.substring(0, stringLength - 1);
- }
-
- this.announceForAccessibility(String.format("%s %s", sliderValue, spokenUnits));
- }
- }
-
-
-
- /**
- * Convert SeekBar's native progress value (e.g. 0..100) to a value passed to JS (e.g. -1.0..2.5).
- */
- public double toRealProgress(int seekBarProgress) {
- if (seekBarProgress == getMax()) {
- return mMaxValue;
- }
- return seekBarProgress * getStepValue() + mMinValue;
- }
-
- /** Update underlying native SeekBar's values. */
- private void updateAll() {
- if (mStep == 0) {
- mStepCalculated = (mMaxValue - mMinValue) / (double) DEFAULT_TOTAL_STEPS;
- }
- setMax(getTotalSteps());
- setKeyProgressIncrement(1);
- updateLowerLimit();
- updateUpperLimit();
- updateValue();
- }
-
- /** Update limit based on props limit, max and min
- * Fallback to upper limit if invalid configuration provided
- */
- private void updateLowerLimit() {
- double limit = Math.max(mRealLowerLimit, mMinValue);
- int lowerLimit = (int) Math.round((limit - mMinValue) / (mMaxValue - mMinValue) * getTotalSteps());
- if(lowerLimit > mUpperLimit) {
- Log.d("Invalid configuration", "upperLimit < lowerLimit; lowerLimit not set");
- }else {
- mLowerLimit = Math.min(lowerLimit, mUpperLimit);
- }
- }
-
- /** Update limit based on props limit, max and min
- */
- private void updateUpperLimit() {
- double limit = Math.min(mRealUpperLimit, mMaxValue);
- int upperLimit = (int) Math.round((limit - mMinValue) / (mMaxValue - mMinValue) * getTotalSteps());
- if (mLowerLimit > upperLimit) {
- Log.d("Invalid configuration", "upperLimit < lowerLimit; upperLimit not set");
- } else {
- mUpperLimit = upperLimit;
- }
- }
-
- /** Update value only (optimization in case only value is set). */
- private void updateValue() {
- setProgress((int) Math.round((mValue - mMinValue) / (mMaxValue - mMinValue) * getTotalSteps()));
- }
-
- private int getTotalSteps() {
- return (int) Math.ceil((mMaxValue - mMinValue) / getStepValue());
- }
-
- private double getStepValue() {
- return mStep > 0 ? mStep : mStepCalculated;
- }
-
- private BitmapDrawable getBitmapDrawable(final String uri) {
- BitmapDrawable bitmapDrawable = null;
- ExecutorService executorService = Executors.newSingleThreadExecutor();
- Future future = executorService.submit(new Callable() {
- @Override
- public BitmapDrawable call() {
- BitmapDrawable bitmapDrawable = null;
- try {
- Bitmap bitmap = null;
- if (uri.startsWith("http://") || uri.startsWith("https://") ||
- uri.startsWith("file://") || uri.startsWith("asset://") || uri.startsWith("data:")) {
- bitmap = BitmapFactory.decodeStream(new URL(uri).openStream());
- } else {
- int drawableId = getResources()
- .getIdentifier(uri, "drawable", getContext()
- .getPackageName());
- bitmap = BitmapFactory.decodeResource(getResources(), drawableId);
- }
-
- bitmapDrawable = new BitmapDrawable(getResources(), bitmap);
- } catch (Exception e) {
- e.printStackTrace();
- }
- return bitmapDrawable;
- }
- });
- try {
- bitmapDrawable = future.get();
- } catch (Exception e) {
- e.printStackTrace();
- }
- return bitmapDrawable;
- }
-
- public void setThumbImage(@Nullable final String uri) {
- mThumbImageUri = uri;
- refreshThumb();
- }
-
- public void setThumbSize(final float size) {
- float density = getResources().getDisplayMetrics().density;
- mThumbSizePx = size > 0 ? Math.round(size * density) : 0;
- refreshThumb();
- }
-
- public void setThumbTintColor(@Nullable final Integer color) {
- mThumbTintColor = color;
- if (mThumbImageUri != null || mThumbSizePx > 0) {
- refreshThumb();
- } else {
- applyThumbTintColorFilter();
- }
- }
-
- private void applyThumbTintColorFilter() {
- if (getThumb() == null) {
- return;
- }
-
- if (mThumbTintColor != null) {
- getThumb().setColorFilter(mThumbTintColor, PorterDuff.Mode.SRC_IN);
- } else {
- getThumb().clearColorFilter();
- }
- }
-
- private void refreshThumb() {
- if (mThumbImageUri != null) {
- BitmapDrawable drawable = getBitmapDrawable(mThumbImageUri);
- if (drawable != null) {
- if (mThumbSizePx > 0) {
- Bitmap originalBitmap = drawable.getBitmap();
- Bitmap scaledBitmap =
- Bitmap.createScaledBitmap(originalBitmap, mThumbSizePx, mThumbSizePx, true);
- setThumb(new BitmapDrawable(getResources(), scaledBitmap));
- } else {
- setThumb(drawable);
- }
- applyThumbTintColorFilter();
- // Enable alpha channel for the thumbImage
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- setSplitTrack(false);
- }
- return;
- }
- }
-
- if (mThumbSizePx > 0) {
- Bitmap bitmap = Bitmap.createBitmap(mThumbSizePx, mThumbSizePx, Bitmap.Config.ARGB_8888);
- Canvas canvas = new Canvas(bitmap);
-
- int fillColor =
- mThumbTintColor != null
- ? mThumbTintColor
- : (getThumbTintList() != null ? getThumbTintList().getDefaultColor() : 0xFFFFFFFF);
-
- Paint fillPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- fillPaint.setStyle(Paint.Style.FILL);
- fillPaint.setColor(fillColor);
- float radius = mThumbSizePx / 2f;
- canvas.drawCircle(radius, radius, radius, fillPaint);
-
- Paint strokePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
- strokePaint.setStyle(Paint.Style.STROKE);
- strokePaint.setStrokeWidth(1);
- strokePaint.setColor(0x1A000000);
- canvas.drawCircle(radius, radius, radius - 0.5f, strokePaint);
-
- setThumb(new BitmapDrawable(getResources(), bitmap));
- applyThumbTintColorFilter();
- if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
- setSplitTrack(false);
- }
- } else {
- // No special sizing; keep existing thumb, only apply tint if needed.
- applyThumbTintColorFilter();
- }
- }
-}
diff --git a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderEvent.java b/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderEvent.java
deleted file mode 100644
index 1fe33f6c..00000000
--- a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderEvent.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package com.reactnativecommunity.slider;
-
-import androidx.annotation.Nullable;
-import com.facebook.react.bridge.Arguments;
-import com.facebook.react.bridge.WritableMap;
-import com.facebook.react.uimanager.events.Event;
-
-/**
- * Event emitted by a ReactSliderManager when user changes slider position.
- */
-public class ReactSliderEvent extends Event {
-
- public static final String EVENT_NAME = "topChange";
-
- private final double mValue;
- private final boolean mFromUser;
-
- public ReactSliderEvent(int viewId, double value, boolean fromUser) {
- super(viewId);
- mValue = value;
- mFromUser = fromUser;
- }
-
- public double getValue() {
- return mValue;
- }
-
- public boolean isFromUser() {
- return mFromUser;
- }
-
-
- @Override
- public String getEventName() {
- return EVENT_NAME;
- }
-
- @Override
- public short getCoalescingKey() {
- return 0;
- }
-
- @Nullable
- @Override
- protected WritableMap getEventData() {
- return serializeEventData();
- }
-
- private WritableMap serializeEventData() {
- WritableMap eventData = Arguments.createMap();
- eventData.putInt("target", getViewTag());
- eventData.putDouble("value", getValue());
- eventData.putBoolean("fromUser", isFromUser());
- return eventData;
- }
-}
diff --git a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderManager.java b/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderManager.java
deleted file mode 100644
index bdd08f18..00000000
--- a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderManager.java
+++ /dev/null
@@ -1,243 +0,0 @@
-package com.reactnativecommunity.slider;
-
-import android.content.Context;
-import android.view.View;
-import android.widget.SeekBar;
-import androidx.annotation.Nullable;
-
-import com.facebook.react.bridge.ReactContext;
-import com.facebook.react.bridge.ReadableArray;
-import com.facebook.react.bridge.ReadableMap;
-import com.facebook.react.common.MapBuilder;
-import com.facebook.react.uimanager.PixelUtil;
-import com.facebook.react.uimanager.SimpleViewManager;
-import com.facebook.react.uimanager.ThemedReactContext;
-import com.facebook.react.uimanager.UIManagerHelper;
-import com.facebook.react.uimanager.ViewManagerDelegate;
-import com.facebook.react.uimanager.ViewProps;
-import com.facebook.react.uimanager.annotations.ReactProp;
-import com.facebook.react.uimanager.events.EventDispatcher;
-import java.util.Map;
-import com.facebook.react.viewmanagers.RNCSliderManagerInterface;
-import com.facebook.react.viewmanagers.RNCSliderManagerDelegate;
-import com.facebook.react.module.annotations.ReactModule;
-import com.facebook.yoga.YogaMeasureMode;
-import com.facebook.yoga.YogaMeasureOutput;
-
-/**
- * Manages instances of {@code ReactSlider}.
- */
-@ReactModule(name = ReactSliderManagerImpl.REACT_CLASS)
-public class ReactSliderManager extends SimpleViewManager implements RNCSliderManagerInterface {
-
- private final ViewManagerDelegate mDelegate;
-
- public ReactSliderManager() {
- mDelegate = new RNCSliderManagerDelegate<>(this);
- }
-
- @Nullable
- @Override
- protected ViewManagerDelegate getDelegate() {
- return mDelegate;
- }
-
- private static final SeekBar.OnSeekBarChangeListener ON_CHANGE_LISTENER =
- new SeekBar.OnSeekBarChangeListener() {
- @Override
- public void onProgressChanged(SeekBar seekbar, int progress, boolean fromUser) {
- ReactSlider slider = (ReactSlider)seekbar;
-
- progress = slider.getValidProgressValue(progress);
- seekbar.setProgress(progress);
-
- ReactContext reactContext = (ReactContext) seekbar.getContext();
- if (fromUser) {
- int reactTag = seekbar.getId();
- UIManagerHelper.getEventDispatcherForReactTag(reactContext, reactTag)
- .dispatchEvent(new ReactSliderEvent(reactTag, slider.toRealProgress(progress), true));
- }
- }
-
- @Override
- public void onStartTrackingTouch(SeekBar seekbar) {
- ReactContext reactContext = (ReactContext) seekbar.getContext();
- int reactTag = seekbar.getId();
- ((ReactSlider)seekbar).isSliding(true);
- UIManagerHelper.getEventDispatcherForReactTag(reactContext, reactTag)
- .dispatchEvent(new ReactSlidingStartEvent(
- reactTag,
- ((ReactSlider)seekbar).toRealProgress(seekbar.getProgress())));
- }
-
- @Override
- public void onStopTrackingTouch(SeekBar seekbar) {
- ReactContext reactContext = (ReactContext) seekbar.getContext();
- ((ReactSlider)seekbar).isSliding(false);
- int reactTag = seekbar.getId();
-
- EventDispatcher eventDispatcher = UIManagerHelper.getEventDispatcherForReactTag(reactContext, reactTag);
-
- eventDispatcher.dispatchEvent(
- new ReactSlidingCompleteEvent(
- reactTag,
- ((ReactSlider)seekbar).toRealProgress(seekbar.getProgress()))
- );
- }
- };
-
- @Override
- public String getName() {
- return ReactSliderManagerImpl.REACT_CLASS;
- }
-
- @Override
- protected ReactSlider createViewInstance(ThemedReactContext context) {
- return ReactSliderManagerImpl.createViewInstance(context);
- }
-
- @Override
- @ReactProp(name = "disabled", defaultBoolean = false)
- public void setDisabled(ReactSlider view, boolean disabled) {
- ReactSliderManagerImpl.setDisabled(view, disabled);
- }
-
- @Override
- @ReactProp(name = "value", defaultFloat = 0f)
- public void setValue(ReactSlider view, float value) {
- ReactSliderManagerImpl.setValue(view, value);
- }
-
- @Override
- @ReactProp(name = "minimumValue", defaultFloat = 0f)
- public void setMinimumValue(ReactSlider view, double value) {
- ReactSliderManagerImpl.setMinimumValue(view, value);
- }
-
- @Override
- @ReactProp(name = "maximumValue", defaultFloat = 0f)
- public void setMaximumValue(ReactSlider view, double value) {
- ReactSliderManagerImpl.setMaximumValue(view, value);
- }
-
- @Override
- @ReactProp(name = "step", defaultFloat = 0f)
- public void setStep(ReactSlider view, double value) {
- ReactSliderManagerImpl.setStep(view, value);
- }
-
- @Override
- @ReactProp(name = "thumbTintColor", customType = "Color")
- public void setThumbTintColor(ReactSlider view, Integer color) {
- ReactSliderManagerImpl.setThumbTintColor(view, color);
- }
-
- @Override
- @ReactProp(name = "thumbSize", defaultFloat = 0f)
- public void setThumbSize(ReactSlider view, float size) {
- ReactSliderManagerImpl.setThumbSize(view, size);
- }
-
- @Override
- @ReactProp(name = "minimumTrackTintColor", customType = "Color")
- public void setMinimumTrackTintColor(ReactSlider view, Integer color) {
- ReactSliderManagerImpl.setMinimumTrackTintColor(view, color);
- }
-
- @Override
- @ReactProp(name = "maximumTrackTintColor", customType = "Color")
- public void setMaximumTrackTintColor(ReactSlider view, Integer color) {
- ReactSliderManagerImpl.setMaximumTrackTintColor(view, color);
- }
-
- @Override
- @ReactProp(name = "inverted", defaultBoolean = false)
- public void setInverted(ReactSlider view, boolean inverted) {
- ReactSliderManagerImpl.setInverted(view, inverted);
- }
-
- @Override
- @ReactProp(name = "accessibilityUnits")
- public void setAccessibilityUnits(ReactSlider view, String accessibilityUnits) {
- ReactSliderManagerImpl.setAccessibilityUnits(view, accessibilityUnits);
- }
-
- @Override
- @ReactProp(name = "accessibilityIncrements")
- public void setAccessibilityIncrements(ReactSlider view, ReadableArray accessibilityIncrements) {
- ReactSliderManagerImpl.setAccessibilityIncrements(view, accessibilityIncrements);
- }
-
- @ReactProp(name = "lowerLimit")
- public void setLowerLimit(ReactSlider view, float value) {
- ReactSliderManagerImpl.setLowerLimit(view, value);
- }
-
- @ReactProp(name = "upperLimit")
- public void setUpperLimit(ReactSlider view, float value) {
- ReactSliderManagerImpl.setUpperLimit(view, value);
- }
-
- @Override
- @ReactProp(name = "thumbImage")
- public void setThumbImage(ReactSlider view, @androidx.annotation.Nullable ReadableMap source) {
- ReactSliderManagerImpl.setThumbImage(view, source);
- }
-
- @Override
- public void setTestID(ReactSlider view, @Nullable String value) {
- super.setTestId(view, value);
- }
-
- @Override
- protected void addEventEmitters(final ThemedReactContext reactContext, final ReactSlider view) {
- view.setOnSeekBarChangeListener(ON_CHANGE_LISTENER);
- }
-
- // these props are not available on Android, however we must override their setters
- @Override
- public void setMinimumTrackImage(ReactSlider view, @Nullable ReadableMap readableMap) {}
-
- @Override
- public void setMaximumTrackImage(ReactSlider view, @Nullable ReadableMap readableMap) {}
-
- @Override
- public void setTrackImage(ReactSlider view, @Nullable ReadableMap value) {}
-
- @Override
- public void setTapToSeek(ReactSlider view, boolean value) {}
-
- @Override
- public void setVertical(ReactSlider view, boolean value) {}
-
- @Override
- public long measure(
- Context context,
- ReadableMap localData,
- ReadableMap props,
- ReadableMap state,
- float width,
- YogaMeasureMode widthMode,
- float height,
- YogaMeasureMode heightMode,
- @Nullable float[] attachmentsPositions) {
- ReactSlider view = new ReactSlider(context, null);
- int measureSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
- view.measure(measureSpec, measureSpec);
- return YogaMeasureOutput.make(
- PixelUtil.toDIPFromPixel(view.getMeasuredWidth()),
- PixelUtil.toDIPFromPixel(view.getMeasuredHeight()));
- }
-
- @Nullable
- @Override
- public Map getExportedCustomBubblingEventTypeConstants() {
- return ReactSliderManagerImpl.getExportedCustomBubblingEventTypeConstants();
- }
-
- @Nullable
- @Override
- public Map getExportedCustomDirectEventTypeConstants() {
- return ReactSliderManagerImpl.getExportedCustomDirectEventTypeConstants();
- }
-}
diff --git a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderManagerImpl.java b/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderManagerImpl.java
deleted file mode 100644
index 4d76b983..00000000
--- a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderManagerImpl.java
+++ /dev/null
@@ -1,147 +0,0 @@
-package com.reactnativecommunity.slider;
-
-import android.graphics.PorterDuff;
-import android.graphics.PorterDuffColorFilter;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.os.Build;
-
-import com.facebook.react.bridge.ReadableArray;
-import com.facebook.react.bridge.ReadableMap;
-import com.facebook.react.common.MapBuilder;
-import com.facebook.react.uimanager.ThemedReactContext;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import javax.annotation.Nullable;
-
-public class ReactSliderManagerImpl {
-
- public static final String REACT_CLASS = "RNCSlider";
-
- public static ReactSlider createViewInstance(ThemedReactContext context) {
- ReactSlider slider = new ReactSlider(context, null);
-
- if (Build.VERSION.SDK_INT >= 21) {
- /**
- * The "splitTrack" parameter should have "false" value,
- * otherwise the SeekBar progress line doesn't appear when it is rotated.
- */
- slider.setSplitTrack(false);
- }
-
- return slider;
- }
-
- public static void setValue(ReactSlider view, double value) {
- if (view.isSliding() == false) {
- view.setValue(value);
- if (view.isAccessibilityFocused() && Build.VERSION.SDK_INT > Build.VERSION_CODES.Q) {
- view.setupAccessibility((int)value);
- }
- }
- }
-
- public static void setMinimumValue(ReactSlider view, double value) {
- view.setMinValue(value);
- }
-
- public static void setMaximumValue(ReactSlider view, double value) {
- view.setMaxValue(value);
- }
-
- public static void setLowerLimit(ReactSlider view, double value) {
- view.setLowerLimit(value);
- }
-
- public static void setUpperLimit(ReactSlider view, double value) {
- view.setUpperLimit(value);
- }
-
- public static void setStep(ReactSlider view, double value) {
- view.setStep(value);
- }
-
- public static void setDisabled(ReactSlider view, boolean disabled) {
- view.setEnabled(!disabled);
- }
-
- public static void setThumbTintColor(ReactSlider view, Integer color) {
- view.setThumbTintColor(color);
- }
-
- public static void setMinimumTrackTintColor(ReactSlider view, Integer color) {
- LayerDrawable drawable = (LayerDrawable) view.getProgressDrawable().getCurrent();
- Drawable progress = drawable.findDrawableByLayerId(android.R.id.progress);
- if (color == null) {
- progress.clearColorFilter();
- } else {
- if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
- progress.setColorFilter(new PorterDuffColorFilter((int)color, PorterDuff.Mode.SRC_IN));
- }
- else {
- progress.setColorFilter(color, PorterDuff.Mode.SRC_IN);
- }
- }
- }
-
- public static void setThumbImage(ReactSlider view, @Nullable ReadableMap source) {
- String uri = null;
- if (source != null) {
- uri = source.getString("uri");
- }
- view.setThumbImage(uri);
- }
-
- public static void setThumbSize(ReactSlider view, float size) {
- view.setThumbSize(size);
- }
-
- public static void setMaximumTrackTintColor(ReactSlider view, Integer color) {
- LayerDrawable drawable = (LayerDrawable) view.getProgressDrawable().getCurrent();
- Drawable background = drawable.findDrawableByLayerId(android.R.id.background);
- if (color == null) {
- background.clearColorFilter();
- } else {
- if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
- background.setColorFilter(new PorterDuffColorFilter((int)color, PorterDuff.Mode.SRC_IN));
- }
- else {
- background.setColorFilter(color, PorterDuff.Mode.SRC_IN);
- }
- }
- }
-
- public static void setInverted(ReactSlider view, boolean inverted) {
- if (inverted) view.setScaleX(-1f);
- else view.setScaleX(1f);
- }
-
- public static void setAccessibilityUnits(ReactSlider view, String accessibilityUnits) {
- view.setAccessibilityUnits(accessibilityUnits);
- }
-
- public static void setAccessibilityIncrements(ReactSlider view, ReadableArray accessibilityIncrements) {
- List objectList = accessibilityIncrements.toArrayList();
- List stringList = new ArrayList<>();
- for(Object item: objectList) {
- stringList.add((String)item);
- }
- view.setAccessibilityIncrements(stringList);
- }
-
- public static Map getExportedCustomBubblingEventTypeConstants() {
- return MapBuilder.of(
- ReactSliderEvent.EVENT_NAME, MapBuilder.of("registrationName", ReactSliderEvent.EVENT_NAME)
- );
- }
-
- public static Map getExportedCustomDirectEventTypeConstants() {
- return MapBuilder.of(
- ReactSlidingStartEvent.EVENT_NAME, MapBuilder.of("registrationName", ReactSlidingStartEvent.EVENT_NAME),
- ReactSlidingCompleteEvent.EVENT_NAME, MapBuilder.of("registrationName", ReactSlidingCompleteEvent.EVENT_NAME)
- );
- }
-}
diff --git a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderPackage.java b/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderPackage.java
deleted file mode 100644
index 38a3f1f7..00000000
--- a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSliderPackage.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package com.reactnativecommunity.slider;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import com.facebook.react.ReactPackage;
-import com.facebook.react.bridge.NativeModule;
-import com.facebook.react.bridge.ReactApplicationContext;
-import com.facebook.react.uimanager.ViewManager;
-import com.facebook.react.bridge.JavaScriptModule;
-
-public class ReactSliderPackage implements ReactPackage {
- @Override
- public List createNativeModules(ReactApplicationContext reactContext) {
- return Collections.emptyList();
- }
-
- // Deprecated from RN 0.47
- public List> createJSModules() {
- return Collections.emptyList();
- }
-
- @Override
- @SuppressWarnings("rawtypes")
- public List createViewManagers(ReactApplicationContext reactContext) {
- return Arrays.asList(new ReactSliderManager());
- }
-}
diff --git a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlidingCompleteEvent.java b/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlidingCompleteEvent.java
deleted file mode 100644
index b6e2a0e3..00000000
--- a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlidingCompleteEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.reactnativecommunity.slider;
-
-import androidx.annotation.Nullable;
-import com.facebook.react.bridge.Arguments;
-import com.facebook.react.bridge.WritableMap;
-import com.facebook.react.uimanager.events.Event;
-
-/**
- * Event emitted when the user finishes dragging the slider.
- */
-public class ReactSlidingCompleteEvent extends Event {
-
- public static final String EVENT_NAME = "onRNCSliderSlidingComplete";
-
- private final double mValue;
-
- public ReactSlidingCompleteEvent(int viewId, double value) {
- super(viewId);
- mValue = value;
- }
-
- public double getValue() {
- return mValue;
- }
-
- @Override
- public String getEventName() {
- return EVENT_NAME;
- }
-
- @Override
- public short getCoalescingKey() {
- return 0;
- }
-
- @Override
- public boolean canCoalesce() {
- return false;
- }
-
- @Nullable
- @Override
- protected WritableMap getEventData() {
- return serializeEventData();
- }
-
- private WritableMap serializeEventData() {
- WritableMap eventData = Arguments.createMap();
- eventData.putInt("target", getViewTag());
- eventData.putDouble("value", getValue());
- return eventData;
- }
-
-}
diff --git a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlidingStartEvent.java b/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlidingStartEvent.java
deleted file mode 100644
index fe07d8b2..00000000
--- a/package/android/src/main/java/com/reactnativecommunity/slider/ReactSlidingStartEvent.java
+++ /dev/null
@@ -1,54 +0,0 @@
-package com.reactnativecommunity.slider;
-
-import androidx.annotation.Nullable;
-import com.facebook.react.bridge.Arguments;
-import com.facebook.react.bridge.WritableMap;
-import com.facebook.react.uimanager.events.Event;
-
-/**
- * Event emitted when the user starts dragging the slider.
- */
-
-public class ReactSlidingStartEvent extends Event {
- public static final String EVENT_NAME = "onRNCSliderSlidingStart";
-
- private final double mValue;
-
- public ReactSlidingStartEvent(int viewId, double value) {
- super(viewId);
- mValue = value;
- }
-
- public double getValue() {
- return mValue;
- }
-
- @Override
- public String getEventName() {
- return EVENT_NAME;
- }
-
- @Override
- public short getCoalescingKey() {
- return 0;
- }
-
- @Override
- public boolean canCoalesce() {
- return false;
- }
-
- @Nullable
- @Override
- protected WritableMap getEventData() {
- return serializeEventData();
- }
-
- private WritableMap serializeEventData() {
- WritableMap eventData = Arguments.createMap();
- eventData.putInt("target", getViewTag());
- eventData.putDouble("value", getValue());
- return eventData;
- }
-
-}
diff --git a/package/android/src/main/jni/CMakeLists.txt b/package/android/src/main/jni/CMakeLists.txt
index 6fe63910..32493c68 100644
--- a/package/android/src/main/jni/CMakeLists.txt
+++ b/package/android/src/main/jni/CMakeLists.txt
@@ -1,93 +1,44 @@
cmake_minimum_required(VERSION 3.13)
-set(CMAKE_VERBOSE_MAKEFILE ON)
+set(CMAKE_VERBOSE_MAKEFILE on)
-set(LIB_LITERAL RNCSlider)
+include(${REACT_ANDROID_DIR}/../ReactCommon/cmake-utils/react-native-flags.cmake)
+
+set(LIB_LITERAL Slider)
set(LIB_TARGET_NAME react_codegen_${LIB_LITERAL})
set(LIB_ANDROID_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../..)
-set(LIB_COMMON_DIR ${LIB_ANDROID_DIR}/../common/cpp)
-set(LIB_ANDROID_GENERATED_JNI_DIR ${LIB_ANDROID_DIR}/build/generated/source/codegen/jni)
-set(LIB_ANDROID_GENERATED_COMPONENTS_DIR ${LIB_ANDROID_GENERATED_JNI_DIR}/react/renderer/components/${LIB_LITERAL})
+set(LIB_GENERATED_DIR ${LIB_ANDROID_DIR}/build/generated/source/codegen/jni)
+set(LIB_COMPONENTS_DIR ${LIB_GENERATED_DIR}/react/renderer/components/${LIB_LITERAL})
-file(GLOB LIB_CUSTOM_SRCS CONFIGURE_DEPENDS *.cpp ${LIB_COMMON_DIR}/react/renderer/components/${LIB_LITERAL}/*.cpp)
-file(GLOB LIB_CODEGEN_SRCS CONFIGURE_DEPENDS ${LIB_ANDROID_GENERATED_JNI_DIR}/*.cpp ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}/*.cpp)
+file(GLOB LIB_CODEGEN_SRCS CONFIGURE_DEPENDS ${LIB_GENERATED_DIR}/*.cpp ${LIB_COMPONENTS_DIR}/*.cpp)
add_library(
${LIB_TARGET_NAME}
- SHARED
- ${LIB_CUSTOM_SRCS}
+ OBJECT
${LIB_CODEGEN_SRCS}
)
target_include_directories(
${LIB_TARGET_NAME}
PUBLIC
- .
- ${LIB_COMMON_DIR}
- ${LIB_ANDROID_GENERATED_JNI_DIR}
- ${LIB_ANDROID_GENERATED_COMPONENTS_DIR}
-)
-
-# https://github.com/react-native-community/discussions-and-proposals/discussions/816
-# This if-then-else can be removed once this library does not support version below 0.76
-if (REACTNATIVE_MERGED_SO)
- target_link_libraries(
- ${LIB_TARGET_NAME}
- fbjni
- jsi
- reactnative
- )
-else()
- target_link_libraries(
- ${LIB_TARGET_NAME}
- fbjni
- folly_runtime
- glog
- jsi
- react_codegen_rncore
- react_debug
- react_render_componentregistry
- react_render_core
- react_render_debug
- react_render_graphics
- react_render_imagemanager
- react_render_mapbuffer
- react_utils
- react_nativemodule_core
- rrc_image
- turbomodulejsijni
- rrc_view
- yoga
- )
-endif()
-
-if(ReactAndroid_VERSION_MINOR GREATER_EQUAL 81)
- target_compile_reactnative_options(${LIB_TARGET_NAME} PUBLIC)
-else()
- target_compile_options(
- ${LIB_TARGET_NAME}
- PRIVATE
- -fexceptions
- -frtti
- -std=c++20
- -Wall
- -Wpedantic
- -Wno-gnu-zero-variadic-macro-arguments
- )
-endif()
-
-target_compile_options(
- ${LIB_TARGET_NAME}
- PRIVATE
- -DLOG_TAG=\"ReactNative\"
- -fexceptions
- -frtti
- -std=c++20
- -Wall
+ ${CMAKE_CURRENT_SOURCE_DIR}
+ ${LIB_GENERATED_DIR}
+ ${LIB_COMPONENTS_DIR}
)
target_include_directories(
${CMAKE_PROJECT_NAME}
PUBLIC
${CMAKE_CURRENT_SOURCE_DIR}
+ ${LIB_GENERATED_DIR}
+ ${LIB_COMPONENTS_DIR}
)
+
+target_link_libraries(
+ ${LIB_TARGET_NAME}
+ fbjni
+ jsi
+ reactnative
+)
+
+target_compile_reactnative_options(${LIB_TARGET_NAME} PRIVATE)
diff --git a/package/android/src/main/jni/RNCSlider.h b/package/android/src/main/jni/Slider.h
similarity index 68%
rename from package/android/src/main/jni/RNCSlider.h
rename to package/android/src/main/jni/Slider.h
index f0c0e9f5..25f52bdf 100644
--- a/package/android/src/main/jni/RNCSlider.h
+++ b/package/android/src/main/jni/Slider.h
@@ -3,16 +3,14 @@
#include
#include
#include
-#include
namespace facebook {
namespace react {
JSI_EXPORT
-std::shared_ptr RNCSlider_ModuleProvider(
+std::shared_ptr Slider_ModuleProvider(
const std::string &moduleName,
const JavaTurboModule::InitParams ¶ms);
} // namespace react
} // namespace facebook
-
diff --git a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderComponentDescriptor.h b/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderComponentDescriptor.h
deleted file mode 100644
index 8bc649ad..00000000
--- a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderComponentDescriptor.h
+++ /dev/null
@@ -1,44 +0,0 @@
-#pragma once
-
-#include
-#include
-#include "RNCSliderMeasurementsManager.h"
-
-namespace facebook {
- namespace react {
-
- class RNCSliderComponentDescriptor final
- : public ConcreteComponentDescriptor {
-#ifdef ANDROID
- public:
- RNCSliderComponentDescriptor(const ComponentDescriptorParameters ¶meters)
- : ConcreteComponentDescriptor(parameters), measurementsManager_(
- std::make_shared(contextContainer_)) {}
-
- void adopt(ShadowNode &shadowNode) const override {
- ConcreteComponentDescriptor::adopt(shadowNode);
-
-
- auto &rncSliderShadowNode =
- static_cast(shadowNode);
-
- // `RNCSliderShadowNode` uses `RNCSliderMeasurementsManager` to
- // provide measurements to Yoga.
- rncSliderShadowNode.setSliderMeasurementsManager(
- measurementsManager_);
-
- // All `RNCSliderShadowNode`s must have leaf Yoga nodes with properly
- // setup measure function.
- rncSliderShadowNode.enableMeasurement();
- }
- private:
- const std::shared_ptr measurementsManager_;
-#else
- public:
- RNCSliderComponentDescriptor(const ComponentDescriptorParameters ¶meters)
- : ConcreteComponentDescriptor(parameters) {}
-#endif
- };
-
- }
-}
diff --git a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderMeasurementsManager.cpp b/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderMeasurementsManager.cpp
deleted file mode 100644
index fada95c9..00000000
--- a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderMeasurementsManager.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-#ifdef ANDROID
-#include "RNCSliderMeasurementsManager.h"
-
-#include
-#include
-#include
-
-using namespace facebook::jni;
-
-namespace facebook::react {
-
-Size RNCSliderMeasurementsManager::measure(
- SurfaceId surfaceId,
- LayoutConstraints layoutConstraints) const {
- {
- std::scoped_lock lock(mutex_);
- if (hasBeenMeasured_) {
- return cachedMeasurement_;
- }
- }
-
- const jni::global_ref& fabricUIManager =
- contextContainer_->at>("FabricUIManager");
-
- static auto measure =
- jni::findClassStatic("com/facebook/react/fabric/FabricUIManager")
- ->getMethod("measure");
-
- auto minimumSize = layoutConstraints.minimumSize;
- auto maximumSize = layoutConstraints.maximumSize;
-
- local_ref componentName = make_jstring("RNCSlider");
-
- auto measurement = yogaMeassureToSize(measure(
- fabricUIManager,
- surfaceId,
- componentName.get(),
- nullptr,
- nullptr,
- nullptr,
- minimumSize.width,
- maximumSize.width,
- minimumSize.height,
- maximumSize.height));
-
- std::scoped_lock lock(mutex_);
- cachedMeasurement_ = measurement;
- hasBeenMeasured_ = true;
- return measurement;
-}
-
-}
-#endif
diff --git a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderMeasurementsManager.h b/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderMeasurementsManager.h
deleted file mode 100644
index adcb27b5..00000000
--- a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderMeasurementsManager.h
+++ /dev/null
@@ -1,26 +0,0 @@
-#ifdef ANDROID
-#pragma once
-
-#include
-#include
-#include
-
-namespace facebook::react {
-
- class RNCSliderMeasurementsManager {
- public:
- RNCSliderMeasurementsManager(
- const std::shared_ptr &contextContainer)
- : contextContainer_(contextContainer) {}
-
- Size measure(SurfaceId surfaceId, LayoutConstraints layoutConstraints) const;
-
- private:
- const std::shared_ptr contextContainer_;
- mutable std::mutex mutex_;
- mutable bool hasBeenMeasured_ = false;
- mutable Size cachedMeasurement_{};
-
- };
-}
-#endif
diff --git a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderShadowNode.cpp b/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderShadowNode.cpp
deleted file mode 100644
index d10cb078..00000000
--- a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderShadowNode.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-#include "RNCSliderShadowNode.h"
-#include "RNCSliderMeasurementsManager.h"
-
-namespace facebook {
- namespace react {
-
- extern const char RNCSliderComponentName[] = "RNCSlider";
-
-#ifdef ANDROID
- void RNCSliderShadowNode::setSliderMeasurementsManager(
- const std::shared_ptr &
- measurementsManager) {
- ensureUnsealed();
- measurementsManager_ = measurementsManager;
- }
-
-#pragma mark - LayoutableShadowNode
-
- Size RNCSliderShadowNode::measureContent(
- const LayoutContext & /*layoutContext*/,
- const LayoutConstraints &layoutConstraints) const {
- return measurementsManager_->measure(getSurfaceId(), layoutConstraints);
- }
-#endif
-
- }
-}
diff --git a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderShadowNode.h b/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderShadowNode.h
deleted file mode 100644
index b30099fe..00000000
--- a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderShadowNode.h
+++ /dev/null
@@ -1,45 +0,0 @@
-#pragma once
-
-#include
-#include
-#include
-#include
-#include
-
-#include "RNCSliderMeasurementsManager.h"
-
-namespace facebook {
- namespace react {
-
- JSI_EXPORT extern const char RNCSliderComponentName[];
-
-/*
- * `ShadowNode` for component.
- */
- class JSI_EXPORT RNCSliderShadowNode final
- : public ConcreteViewShadowNode<
- RNCSliderComponentName,
- RNCSliderProps,
- RNCSliderEventEmitter,
- RNCSliderState> {
- public:
- using ConcreteViewShadowNode::ConcreteViewShadowNode;
-
-#ifdef ANDROID
- void setSliderMeasurementsManager(
- const std::shared_ptr &measurementsManager);
-
-#pragma mark - LayoutableShadowNode
-
- Size measureContent(
- const LayoutContext &layoutContext,
- const LayoutConstraints &layoutConstraints) const override;
-
- private:
- std::shared_ptr measurementsManager_;
-#endif
-
- };
-
- }
-}
diff --git a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderState.h b/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderState.h
deleted file mode 100644
index 13cdf8e5..00000000
--- a/package/common/cpp/react/renderer/components/RNCSlider/RNCSliderState.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#pragma once
-
-#ifdef ANDROID
-#include
-#include
-#include
-#endif
-
-namespace facebook {
-namespace react {
-
-class RNCSliderState {
-public:
- RNCSliderState() = default;
-
-#ifdef ANDROID
- RNCSliderState(RNCSliderState const &previousState, folly::dynamic data){};
- folly::dynamic getDynamic() const {
- return {};
- };
- MapBuffer getMapBuffer() const {
- return MapBufferBuilder::EMPTY();
- };
-#endif
-};
-
-}
-}
diff --git a/package/ios/RNCSlider.h b/package/ios/RNCSlider.h
deleted file mode 100644
index aa9d1855..00000000
--- a/package/ios/RNCSlider.h
+++ /dev/null
@@ -1,31 +0,0 @@
-#import
-
-#import
-
-@interface RNCSlider : UISlider
-
-@property (nonatomic, copy) RCTBubblingEventBlock onRNCSliderValueChange;
-@property (nonatomic, copy) RCTBubblingEventBlock onRNCSliderSlidingStart;
-@property (nonatomic, copy) RCTBubblingEventBlock onRNCSliderSlidingComplete;
-
-@property (nonatomic, assign) float step;
-@property (nonatomic, assign) float lastValue;
-@property (nonatomic, assign) bool isSliding;
-
-@property (nonatomic, assign) float lowerLimit;
-@property (nonatomic, assign) float upperLimit;
-
-@property (nonatomic, strong) UIImage *trackImage;
-@property (nonatomic, strong) UIImage *minimumTrackImage;
-@property (nonatomic, strong) UIImage *maximumTrackImage;
-@property (nonatomic, strong) UIImage *thumbImage;
-@property (nonatomic, assign) CGFloat thumbSize;
-@property (nonatomic, assign) bool tapToSeek;
-@property (nonatomic, strong) NSString *accessibilityUnits;
-@property (nonatomic, strong) NSArray *accessibilityIncrements;
-
-- (float) discreteValue:(float)value;
-- (void) setDisabled:(bool)disabled;
-- (void) refreshThumb;
-
-@end
diff --git a/package/ios/RNCSlider.m b/package/ios/RNCSlider.m
deleted file mode 100644
index 8bc1c248..00000000
--- a/package/ios/RNCSlider.m
+++ /dev/null
@@ -1,256 +0,0 @@
-#import "RNCSlider.h"
-
-@implementation RNCSlider
-{
- float _unclippedValue;
- bool _minimumTrackImageSet;
- bool _maximumTrackImageSet;
- UIImage *_thumbImage;
- CGFloat _thumbSize;
- UIColor *_thumbTintColor;
-}
-
-- (instancetype)init {
- if (self = [super init]) {
- _upperLimit = FLT_MAX;
- _lowerLimit = FLT_MIN;
- }
- return self;
-}
-
-- (instancetype)initWithFrame:(CGRect)frame
-{
- return [super initWithFrame:frame];
-}
-
-- (void)setValue:(float)value
-{
- value = [self discreteValue:value];
- _unclippedValue = value;
- super.value = value;
- [self setupAccessibility:value];
-}
-
-- (void)setValue:(float)value animated:(BOOL)animated
-{
- value = [self discreteValue:value];
- _unclippedValue = value;
- [super setValue:value animated:animated];
- [self setupAccessibility:value];
-}
-
-- (void)setupAccessibility:(float)value
-{
- if (self.accessibilityUnits && self.accessibilityIncrements && [self.accessibilityIncrements count] - 1 == (int)self.maximumValue) {
- int index = (int)value;
- NSString *sliderValue = (NSString *)[self.accessibilityIncrements objectAtIndex:index];
- NSUInteger stringLength = [self.accessibilityUnits length];
-
- NSString *spokenUnits = [NSString stringWithString:self.accessibilityUnits];
- if (sliderValue && [sliderValue intValue] == 1) {
- spokenUnits = [spokenUnits substringToIndex:stringLength-1];
- }
-
- self.accessibilityValue = [NSString stringWithFormat:@"%@ %@", sliderValue, spokenUnits];
- }
-}
-
-- (void)setMinimumValue:(float)minimumValue
-{
- super.minimumValue = minimumValue;
- super.value = _unclippedValue;
-}
-
-- (void)setMaximumValue:(float)maximumValue
-{
- super.maximumValue = maximumValue;
- super.value = _unclippedValue;
-}
-
-- (void)setTrackImage:(UIImage *)trackImage
-{
- if (trackImage != _trackImage) {
- _trackImage = trackImage;
- CGFloat width = trackImage.size.width / 2;
- if (!_minimumTrackImageSet) {
- UIImage *minimumTrackImage = [trackImage resizableImageWithCapInsets:(UIEdgeInsets){
- 0, width, 0, width
- } resizingMode:UIImageResizingModeStretch];
- [self setMinimumTrackImage:minimumTrackImage forState:UIControlStateNormal];
- }
- if (!_maximumTrackImageSet) {
- UIImage *maximumTrackImage = [trackImage resizableImageWithCapInsets:(UIEdgeInsets){
- 0, width, 0, width
- } resizingMode:UIImageResizingModeStretch];
- [self setMaximumTrackImage:maximumTrackImage forState:UIControlStateNormal];
- }
- }
-}
-
-- (void)setMinimumTrackImage:(UIImage *)minimumTrackImage
-{
- _trackImage = nil;
- _minimumTrackImageSet = true;
- minimumTrackImage = [minimumTrackImage resizableImageWithCapInsets:(UIEdgeInsets){
- 0, minimumTrackImage.size.width, 0, 0
- } resizingMode:UIImageResizingModeStretch];
- [self setMinimumTrackImage:minimumTrackImage forState:UIControlStateNormal];
-}
-
-- (UIImage *)minimumTrackImage
-{
- return [self thumbImageForState:UIControlStateNormal];
-}
-
-- (void)setMaximumTrackImage:(UIImage *)maximumTrackImage
-{
- _trackImage = nil;
- _maximumTrackImageSet = true;
- maximumTrackImage = [maximumTrackImage resizableImageWithCapInsets:(UIEdgeInsets){
- 0, 0, 0, maximumTrackImage.size.width
- } resizingMode:UIImageResizingModeStretch];
- [self setMaximumTrackImage:maximumTrackImage forState:UIControlStateNormal];
-}
-
-- (UIImage *)maximumTrackImage
-{
- return [self thumbImageForState:UIControlStateNormal];
-}
-
-- (void)setThumbImage:(UIImage *)thumbImage
-{
- _thumbImage = thumbImage;
- [self refreshThumb];
-}
-
-- (UIImage *)thumbImage
-{
- return [self thumbImageForState:UIControlStateNormal];
-}
-
-- (void)setThumbSize:(CGFloat)thumbSize
-{
- _thumbSize = thumbSize;
- [self refreshThumb];
-}
-
-- (void)setThumbTintColor:(UIColor *)thumbTintColor
-{
- _thumbTintColor = thumbTintColor;
- [super setThumbTintColor:thumbTintColor];
-
- [self refreshThumb];
-}
-
-- (void)refreshThumb
-{
- if (![NSThread isMainThread]) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self refreshThumb];
- });
- return;
- }
-
- UIImage *imageToSet = nil;
-
- if (_thumbSize > 0) {
- CGSize newSize = CGSizeMake(_thumbSize, _thumbSize);
- UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
- CGContextRef context = UIGraphicsGetCurrentContext();
-
- if (_thumbImage) {
- [_thumbImage drawInRect:CGRectMake(0, 0, newSize.width, newSize.height)];
- } else {
- UIColor *fillColor = _thumbTintColor ?: self.thumbTintColor ?: [UIColor whiteColor];
- CGContextSetFillColorWithColor(context, fillColor.CGColor);
- CGContextFillEllipseInRect(context, CGRectMake(0, 0, newSize.width, newSize.height));
-
- CGContextSetStrokeColorWithColor(context, [[UIColor colorWithWhite:0.0 alpha:0.1] CGColor]);
- CGContextSetLineWidth(context, 0.5);
- CGContextStrokeEllipseInRect(
- context,
- CGRectMake(0.25, 0.25, newSize.width - 0.5, newSize.height - 0.5));
- }
-
- imageToSet = UIGraphicsGetImageFromCurrentImageContext();
- UIGraphicsEndImageContext();
- } else if (_thumbImage) {
- imageToSet = _thumbImage;
- }
-
- if (imageToSet) {
- [self setThumbImage:imageToSet forState:UIControlStateNormal];
- [self setThumbImage:imageToSet forState:UIControlStateHighlighted];
- [self setThumbImage:imageToSet forState:UIControlStateSelected];
- }
-
- [UIView performWithoutAnimation:^{
- float currentValue = super.value;
- float minimumValue = super.minimumValue;
- float maximumValue = super.maximumValue;
-
- float eps = (maximumValue - minimumValue) / 1000.0f;
- if (eps <= 0) {
- eps = 0.0001f;
- }
-
- float nudgedValue = currentValue + eps;
- if (nudgedValue > maximumValue) {
- nudgedValue = currentValue - eps;
- }
- if (nudgedValue < minimumValue) {
- nudgedValue = minimumValue;
- }
-
- if (nudgedValue != currentValue) {
- [super setValue:nudgedValue animated:NO];
- }
- [super setValue:currentValue animated:NO];
-
- [self setNeedsLayout];
- [self layoutSubviews];
- [self layoutIfNeeded];
- }];
-}
-
-- (void)setInverted:(BOOL)inverted
-{
- if (inverted) {
- self.transform = CGAffineTransformMakeScale(-1, 1);
- } else {
- self.transform = CGAffineTransformMakeScale(1, 1);
- }
-}
-
-- (void)setDisabled:(BOOL)disabled
-{
- self.enabled = !disabled;
- [self layoutSubviews];
-}
-
-- (float)discreteValue:(float)value
-{
- if (self.step > 0 && value >= self.maximumValue) {
- return self.maximumValue;
- }
-
- if (self.step > 0 && self.step <= (self.maximumValue - self.minimumValue)) {
- double (^_round)(double) = ^(double x) {
- if (!UIAccessibilityIsVoiceOverRunning()) {
- return round(x);
- } else if (self.lastValue > value) {
- return floor(x);
- } else {
- return ceil(x);
- }
- };
-
- return MAX(self.minimumValue,
- MIN(self.maximumValue, self.minimumValue + _round((value - self.minimumValue) / self.step) * self.step)
- );
- }
-
- return value;
-}
-
-@end
diff --git a/package/ios/RNCSliderComponentView.h b/package/ios/RNCSliderComponentView.h
deleted file mode 100644
index 3bb041d7..00000000
--- a/package/ios/RNCSliderComponentView.h
+++ /dev/null
@@ -1,36 +0,0 @@
-#import
-#import
-#import "RNCSlider.h"
-
-NS_ASSUME_NONNULL_BEGIN
-
-typedef void (^RNCLoadImageCompletionBlock)(NSError * _Nullable error, UIImage * _Nullable image);
-typedef void (^RNCLoadImageFailureBlock)();
-
-@interface RNCSliderComponentView : RCTViewComponentView
-
-@property (nonatomic, copy) RCTBubblingEventBlock onRNCSliderValueChange;
-@property (nonatomic, copy) RCTBubblingEventBlock onRNCSliderSlidingStart;
-@property (nonatomic, copy) RCTBubblingEventBlock onRNCSliderSlidingComplete;
-
-@property (nonatomic, assign) float step;
-@property (nonatomic, assign) float lastValue;
-@property (nonatomic, assign) bool isSliding;
-
-@property (nonatomic, assign) float lowerLimit;
-@property (nonatomic, assign) float upperLimit;
-
-@property (nonatomic, strong) UIImage *trackImage;
-@property (nonatomic, strong) UIImage *minimumTrackImage;
-@property (nonatomic, strong) UIImage *maximumTrackImage;
-@property (nonatomic, strong) UIImage *thumbImage;
-@property (nonatomic, assign) CGFloat thumbSize;
-@property (nonatomic, assign) bool tapToSeek;
-@property (nonatomic, strong) NSString *accessibilityUnits;
-@property (nonatomic, strong) NSArray *accessibilityIncrements;
-
-- (float) discreteValue:(float)value;
-
-@end
-
-NS_ASSUME_NONNULL_END
diff --git a/package/ios/RNCSliderComponentView.mm b/package/ios/RNCSliderComponentView.mm
deleted file mode 100644
index 605487a8..00000000
--- a/package/ios/RNCSliderComponentView.mm
+++ /dev/null
@@ -1,309 +0,0 @@
-#import "RNCSliderComponentView.h"
-
-#import
-
-#import
-#import
-#import
-#import
-#import
-#import "RCTImagePrimitivesConversions.h"
-#import
-#import "RCTFabricComponentsPlugins.h"
-#import "RNCSlider.h"
-
-using namespace facebook::react;
-
-@interface RNCSliderComponentView ()
-
-@end
-
-
-@implementation RNCSliderComponentView
-{
- RNCSlider *slider;
- UIImage *_image;
- BOOL _isSliding;
-}
-
-+ (ComponentDescriptorProvider)componentDescriptorProvider
-{
- return concreteComponentDescriptorProvider();
-}
-
-+ (BOOL)shouldBeRecycled {
- return NO;
-}
-
-- (instancetype)initWithFrame:(CGRect)frame
-{
- if (self = [super initWithFrame:frame]) {
- static const auto defaultProps = std::make_shared();
- _props = defaultProps;
- slider = [[RNCSlider alloc] initWithFrame:self.bounds];
- [slider addTarget:self action:@selector(sliderValueChanged:)
- forControlEvents:UIControlEventValueChanged];
- [slider addTarget:self action:@selector(sliderTouchStart:)
- forControlEvents:UIControlEventTouchDown];
- [slider addTarget:self action:@selector(sliderTouchEnd:)
- forControlEvents:(UIControlEventTouchUpInside |
- UIControlEventTouchUpOutside |
- UIControlEventTouchCancel)];
-
- UITapGestureRecognizer *tapGesturer;
- tapGesturer = [[UITapGestureRecognizer alloc] initWithTarget: self action:@selector(tapHandler:)];
- [tapGesturer setNumberOfTapsRequired: 1];
- [slider addGestureRecognizer:tapGesturer];
-
- slider.value = (float)defaultProps->value;
- self.contentView = slider;
- }
- return self;
-}
-
-- (void)tapHandler:(UITapGestureRecognizer *)gesture {
- if ([gesture.view class] != [RNCSlider class]) {
- return;
- }
- RNCSlider *slider = (RNCSlider *)gesture.view;
- slider.isSliding = _isSliding;
-
- // Ignore this tap if in the middle of a slide.
- if (_isSliding) {
- return;
- }
-
- if (!slider.tapToSeek) {
- return;
- }
-
- CGPoint touchPoint = [gesture locationInView:slider];
- float rangeWidth = slider.maximumValue - slider.minimumValue;
-
- float sliderPercent;
- if ([UIView userInterfaceLayoutDirectionForSemanticContentAttribute:slider.semanticContentAttribute] == UIUserInterfaceLayoutDirectionRightToLeft) {
- sliderPercent = 1.0 - (touchPoint.x / slider.bounds.size.width);
- } else {
- sliderPercent = touchPoint.x / slider.bounds.size.width;
- }
-
- slider.lastValue = slider.value;
- float value = slider.minimumValue + (rangeWidth * sliderPercent);
-
- if (value < slider.lowerLimit) {
- value = slider.lowerLimit;
- } else if (value > slider.upperLimit) {
- value = slider.upperLimit;
- }
-
- [slider setValue:[slider discreteValue:value] animated: YES];
-
- std::dynamic_pointer_cast(_eventEmitter)
- ->onRNCSliderSlidingStart(RNCSliderEventEmitter::OnRNCSliderSlidingStart{.value = static_cast(slider.lastValue)});
-
- // Trigger onValueChange to address https://github.com/react-native-community/react-native-slider/issues/212
- std::dynamic_pointer_cast(_eventEmitter)
- ->onRNCSliderValueChange(RNCSliderEventEmitter::OnRNCSliderValueChange{.value = static_cast(slider.value)});
-
- std::dynamic_pointer_cast(_eventEmitter)
- ->onRNCSliderSlidingComplete(RNCSliderEventEmitter::OnRNCSliderSlidingComplete{.value = static_cast(slider.value)});
-}
-
-- (void)sliderValueChanged:(RNCSlider *)sender
-{
- [self RNCSendSliderEvent:sender withContinuous:YES isSlidingStart:NO];
-}
-
-- (void)sliderTouchStart:(RNCSlider *)sender
-{
- [self RNCSendSliderEvent:sender withContinuous:NO isSlidingStart:YES];
- _isSliding = YES;
- sender.isSliding = YES;
-}
-
-- (void)sliderTouchEnd:(RNCSlider *)sender
-{
- [self RNCSendSliderEvent:sender withContinuous:NO isSlidingStart:NO];
- sender.isSliding = NO;
- _isSliding = NO;
-}
-
-- (void)RNCSendSliderEvent:(RNCSlider *)sender withContinuous:(BOOL)continuous isSlidingStart:(BOOL)isSlidingStart
-{
- float value = [sender discreteValue:sender.value];
-
- if (value < sender.lowerLimit) {
- value = sender.lowerLimit;
- [sender setValue:value animated:NO];
- } else if (value > sender.upperLimit) {
- value = sender.upperLimit;
- [sender setValue:value animated:NO];
- }
-
- if(!sender.isSliding) {
- [sender setValue:value animated:NO];
- }
-
- if (continuous) {
- if (sender.lastValue != value) {
- std::dynamic_pointer_cast(_eventEmitter)
- ->onRNCSliderValueChange(RNCSliderEventEmitter::OnRNCSliderValueChange{.value = static_cast(value)});
- }
- } else {
- if (!isSlidingStart) {
- std::dynamic_pointer_cast(_eventEmitter)
- ->onRNCSliderSlidingComplete(RNCSliderEventEmitter::OnRNCSliderSlidingComplete{.value = static_cast(value)});
- }
- if (isSlidingStart) {
- std::dynamic_pointer_cast(_eventEmitter)
- ->onRNCSliderSlidingStart(RNCSliderEventEmitter::OnRNCSliderSlidingStart{.value = static_cast(value)});
- }
- }
-
- sender.lastValue = value;
-}
-
-- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
-{
- const auto &oldScreenProps = *std::static_pointer_cast(_props);
- const auto &newScreenProps = *std::static_pointer_cast(props);
-
- if (oldScreenProps.value != newScreenProps.value) {
- if (!slider.isSliding) {
- slider.value = newScreenProps.value;
- }
- }
- if (oldScreenProps.disabled != newScreenProps.disabled) {
- [slider setDisabled: newScreenProps.disabled];
- }
- if (oldScreenProps.step != newScreenProps.step) {
- slider.step = newScreenProps.step;
- }
- if (oldScreenProps.inverted != newScreenProps.inverted) {
- [self setInverted:newScreenProps.inverted];
- }
- if (oldScreenProps.maximumValue != newScreenProps.maximumValue) {
- [slider setMaximumValue:newScreenProps.maximumValue];
- }
- if (slider.lowerLimit != newScreenProps.lowerLimit) {
- if(newScreenProps.lowerLimit > slider.upperLimit){
- NSLog(@"Invalid configuration: upperLimit < lowerLimit; lowerLimit not set");
- } else {
- slider.lowerLimit = newScreenProps.lowerLimit;
- }
- }
- if (slider.upperLimit != newScreenProps.upperLimit) {
- if(newScreenProps.upperLimit < slider.lowerLimit){
- NSLog(@"Invalid configuration: upperLimit < lowerLimit; upperLimit not set");
- } else {
- slider.upperLimit = newScreenProps.upperLimit;
- }
- }
- if (oldScreenProps.tapToSeek != newScreenProps.tapToSeek) {
- slider.tapToSeek = newScreenProps.tapToSeek;
- }
- if (oldScreenProps.minimumValue != newScreenProps.minimumValue) {
- [slider setMinimumValue:newScreenProps.minimumValue];
- }
- if (oldScreenProps.thumbTintColor != newScreenProps.thumbTintColor) {
- slider.thumbTintColor = RCTUIColorFromSharedColor(newScreenProps.thumbTintColor);
- }
- if (oldScreenProps.thumbSize != newScreenProps.thumbSize) {
- slider.thumbSize = newScreenProps.thumbSize;
- }
- if (oldScreenProps.minimumTrackTintColor != newScreenProps.minimumTrackTintColor) {
- slider.minimumTrackTintColor = RCTUIColorFromSharedColor(newScreenProps.minimumTrackTintColor);
- }
- if (oldScreenProps.maximumTrackTintColor != newScreenProps.maximumTrackTintColor) {
- slider.maximumTrackTintColor = RCTUIColorFromSharedColor(newScreenProps.maximumTrackTintColor);
- }
- if (oldScreenProps.accessibilityUnits != newScreenProps.accessibilityUnits) {
- NSString *convertedAccessibilityUnits = [NSString stringWithCString:newScreenProps.accessibilityUnits.c_str()
- encoding:[NSString defaultCStringEncoding]];
- slider.accessibilityUnits = convertedAccessibilityUnits;
- }
- if (oldScreenProps.accessibilityIncrements != newScreenProps.accessibilityIncrements) {
- id accessibilityIncrements = [NSMutableArray new];
- for (auto str : newScreenProps.accessibilityIncrements) {
- [accessibilityIncrements addObject:[NSString stringWithUTF8String:str.c_str()]];
- }
- [slider setAccessibilityIncrements:accessibilityIncrements];
- }
- if (oldScreenProps.thumbImage != newScreenProps.thumbImage) {
- [self loadImageFromImageSource:newScreenProps.thumbImage completionBlock:^(NSError *error, UIImage *image) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self->slider setThumbImage:image];
- });
- }
- failureBlock:^{
- [self->slider setThumbImage:nil];
- }];
- }
- if (oldScreenProps.trackImage != newScreenProps.trackImage) {
- [self loadImageFromImageSource:newScreenProps.trackImage completionBlock:^(NSError *error, UIImage *image) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self->slider setTrackImage:image];
- });
- }
- failureBlock:^{
- [self->slider setTrackImage:nil];
- }];
- }
- if (oldScreenProps.minimumTrackImage != newScreenProps.minimumTrackImage) {
- [self loadImageFromImageSource:newScreenProps.minimumTrackImage completionBlock:^(NSError *error, UIImage *image) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self->slider setMinimumTrackImage:image];
- });
- }
- failureBlock:^{
- [self->slider setMinimumTrackImage:nil];
- }];
- }
- if (oldScreenProps.maximumTrackImage != newScreenProps.maximumTrackImage) {
- [self loadImageFromImageSource:newScreenProps.maximumTrackImage completionBlock:^(NSError *error, UIImage *image) {
- dispatch_async(dispatch_get_main_queue(), ^{
- [self->slider setMaximumTrackImage:image];
- });
- }
- failureBlock:^{
- [self->slider setMaximumTrackImage:nil];
- }];
- }
- [super updateProps:props oldProps:oldProps];
-}
-
-
-// TODO temporarily using bridge, workaround for https://github.com/reactwg/react-native-new-architecture/discussions/31#discussioncomment-2717047, rewrite when Meta comes with a solution.
-- (void)loadImageFromImageSource:(ImageSource)source completionBlock:(RNCLoadImageCompletionBlock)completionBlock failureBlock:(RNCLoadImageFailureBlock)failureBlock
-{
- NSString *uri = [[NSString alloc] initWithUTF8String:source.uri.c_str()];
- if ((BOOL)uri.length) {
- [[[RCTBridge currentBridge] moduleForName:@"ImageLoader"]
- loadImageWithURLRequest:NSURLRequestFromImageSource(source)
- size:CGSizeMake(source.size.width, source.size.height)
- scale:source.scale
- clipped:NO
- resizeMode:RCTResizeModeCover
- progressBlock:nil
- partialLoadBlock:nil
- completionBlock:completionBlock];
- } else {
- failureBlock();
- }
-}
-
-- (void)setInverted:(BOOL)inverted
-{
- if (inverted) {
- self.transform = CGAffineTransformMakeScale(-1, 1);
- } else {
- self.transform = CGAffineTransformMakeScale(1, 1);
- }
-}
-
-@end
-
-Class RNCSliderCls(void)
-{
- return RNCSliderComponentView.class;
-}
diff --git a/package/ios/Slider-Bridging-Header.h b/package/ios/Slider-Bridging-Header.h
new file mode 100644
index 00000000..b23da03e
--- /dev/null
+++ b/package/ios/Slider-Bridging-Header.h
@@ -0,0 +1,2 @@
+#import "RCTComponent.h"
+#import "RCTViewManager.h"
diff --git a/package/ios/RNCSlider.xcodeproj/project.pbxproj b/package/ios/Slider.xcodeproj/project.pbxproj
similarity index 50%
rename from package/ios/RNCSlider.xcodeproj/project.pbxproj
rename to package/ios/Slider.xcodeproj/project.pbxproj
index 057244e9..95a2f18d 100644
--- a/package/ios/RNCSlider.xcodeproj/project.pbxproj
+++ b/package/ios/Slider.xcodeproj/project.pbxproj
@@ -3,16 +3,18 @@
archiveVersion = 1;
classes = {
};
- objectVersion = 50;
+ objectVersion = 46;
objects = {
/* Begin PBXBuildFile section */
- 28C79A23220DC7760061DE82 /* RNCSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 28C79A21220DC7760061DE82 /* RNCSlider.m */; };
- 7682E5172887E3AB00642F2D /* RNCSliderComponentView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 7682E5162887E3AB00642F2D /* RNCSliderComponentView.mm */; };
+ 17E6A4A12CF7B8D100000001 /* SliderComponentView.mm in Sources */ = {isa = PBXBuildFile; fileRef = 17E6A4A02CF7B8D100000001 /* SliderComponentView.mm */; };
+ 5E555C0D2413F4C50049A1A2 /* SliderViewManager.m in Sources */ = {isa = PBXBuildFile; fileRef = B3E7B5891CC2AC0600A0062D /* SliderViewManager.m */; };
+ F4FF95D7245B92E800C19C63 /* SliderView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4FF95D6245B92E800C19C63 /* SliderView.swift */; };
+ F4FF95D9245B92E800C19C63 /* SliderViewManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = F4FF95D8245B92E800C19C63 /* SliderViewManager.swift */; };
/* End PBXBuildFile section */
/* Begin PBXCopyFilesBuildPhase section */
- 28C79A07220DC4CC0061DE82 /* CopyFiles */ = {
+ 58B511D91A9E6C8500147676 /* CopyFiles */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "include/$(PRODUCT_NAME)";
@@ -24,15 +26,17 @@
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
- 28C79A09220DC4CC0061DE82 /* libRNCSlider.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libRNCSlider.a; sourceTree = BUILT_PRODUCTS_DIR; };
- 28C79A1E220DC7760061DE82 /* RNCSlider.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RNCSlider.h; sourceTree = ""; };
- 28C79A21220DC7760061DE82 /* RNCSlider.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = RNCSlider.m; sourceTree = ""; };
- 7682E5152887E39900642F2D /* RNCSliderComponentView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = RNCSliderComponentView.h; sourceTree = ""; };
- 7682E5162887E3AB00642F2D /* RNCSliderComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = RNCSliderComponentView.mm; sourceTree = ""; };
+ 134814201AA4EA6300B7C361 /* libSlider.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libSlider.a; sourceTree = BUILT_PRODUCTS_DIR; };
+ 17E6A4A02CF7B8D100000001 /* SliderComponentView.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = SliderComponentView.mm; sourceTree = ""; };
+ 17E6A4A22CF7B8D100000001 /* slider.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = slider.h; sourceTree = ""; };
+ B3E7B5891CC2AC0600A0062D /* SliderViewManager.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = SliderViewManager.m; sourceTree = ""; };
+ F4FF95D5245B92E700C19C63 /* Slider-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Slider-Bridging-Header.h"; sourceTree = ""; };
+ F4FF95D6245B92E800C19C63 /* SliderView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SliderView.swift; sourceTree = ""; };
+ F4FF95D8245B92E800C19C63 /* SliderViewManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SliderViewManager.swift; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
- 28C79A06220DC4CC0061DE82 /* Frameworks */ = {
+ 58B511D81A9E6C8500147676 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
@@ -42,124 +46,123 @@
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
- 28C79A00220DC4CC0061DE82 = {
+ 134814211AA4EA7D00B7C361 /* Products */ = {
isa = PBXGroup;
children = (
- 7682E5162887E3AB00642F2D /* RNCSliderComponentView.mm */,
- 7682E5152887E39900642F2D /* RNCSliderComponentView.h */,
- 28C79A1E220DC7760061DE82 /* RNCSlider.h */,
- 28C79A21220DC7760061DE82 /* RNCSlider.m */,
- 28C79A0A220DC4CC0061DE82 /* Products */,
+ 134814201AA4EA6300B7C361 /* libSlider.a */,
);
+ name = Products;
sourceTree = "";
};
- 28C79A0A220DC4CC0061DE82 /* Products */ = {
+ 58B511D21A9E6C8500147676 = {
isa = PBXGroup;
children = (
- 28C79A09220DC4CC0061DE82 /* libRNCSlider.a */,
+ 17E6A4A02CF7B8D100000001 /* SliderComponentView.mm */,
+ F4FF95D6245B92E800C19C63 /* SliderView.swift */,
+ F4FF95D8245B92E800C19C63 /* SliderViewManager.swift */,
+ B3E7B5891CC2AC0600A0062D /* SliderViewManager.m */,
+ 17E6A4A22CF7B8D100000001 /* slider.h */,
+ F4FF95D5245B92E700C19C63 /* Slider-Bridging-Header.h */,
+ 134814211AA4EA7D00B7C361 /* Products */,
);
- name = Products;
sourceTree = "";
};
/* End PBXGroup section */
/* Begin PBXNativeTarget section */
- 28C79A08220DC4CC0061DE82 /* RNCSlider */ = {
+ 58B511DA1A9E6C8500147676 /* Slider */ = {
isa = PBXNativeTarget;
- buildConfigurationList = 28C79A12220DC4CC0061DE82 /* Build configuration list for PBXNativeTarget "RNCSlider" */;
+ buildConfigurationList = 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "Slider" */;
buildPhases = (
- 28C79A05220DC4CC0061DE82 /* Sources */,
- 28C79A06220DC4CC0061DE82 /* Frameworks */,
- 28C79A07220DC4CC0061DE82 /* CopyFiles */,
+ 58B511D71A9E6C8500147676 /* Sources */,
+ 58B511D81A9E6C8500147676 /* Frameworks */,
+ 58B511D91A9E6C8500147676 /* CopyFiles */,
);
buildRules = (
);
dependencies = (
);
- name = RNCSlider;
- productName = RNCSlider;
- productReference = 28C79A09220DC4CC0061DE82 /* libRNCSlider.a */;
+ name = Slider;
+ productName = RCTDataManager;
+ productReference = 134814201AA4EA6300B7C361 /* libSlider.a */;
productType = "com.apple.product-type.library.static";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
- 28C79A01220DC4CC0061DE82 /* Project object */ = {
+ 58B511D31A9E6C8500147676 /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1010;
- ORGANIZATIONNAME = "React Native Community";
+ LastUpgradeCheck = 0920;
+ ORGANIZATIONNAME = Facebook;
TargetAttributes = {
- 28C79A08220DC4CC0061DE82 = {
- CreatedOnToolsVersion = 10.1;
+ 58B511DA1A9E6C8500147676 = {
+ CreatedOnToolsVersion = 6.1.1;
};
};
};
- buildConfigurationList = 28C79A04220DC4CC0061DE82 /* Build configuration list for PBXProject "RNCSlider" */;
- compatibilityVersion = "Xcode 9.3";
- developmentRegion = en;
+ buildConfigurationList = 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "Slider" */;
+ compatibilityVersion = "Xcode 3.2";
+ developmentRegion = English;
hasScannedForEncodings = 0;
knownRegions = (
+ English,
en,
);
- mainGroup = 28C79A00220DC4CC0061DE82;
- productRefGroup = 28C79A0A220DC4CC0061DE82 /* Products */;
+ mainGroup = 58B511D21A9E6C8500147676;
+ productRefGroup = 58B511D21A9E6C8500147676;
projectDirPath = "";
projectRoot = "";
targets = (
- 28C79A08220DC4CC0061DE82 /* RNCSlider */,
+ 58B511DA1A9E6C8500147676 /* Slider */,
);
};
/* End PBXProject section */
/* Begin PBXSourcesBuildPhase section */
- 28C79A05220DC4CC0061DE82 /* Sources */ = {
+ 58B511D71A9E6C8500147676 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
- 7682E5172887E3AB00642F2D /* RNCSliderComponentView.mm in Sources */,
- 28C79A23220DC7760061DE82 /* RNCSlider.m in Sources */,
+ 17E6A4A12CF7B8D100000001 /* SliderComponentView.mm in Sources */,
+ F4FF95D7245B92E800C19C63 /* SliderView.swift in Sources */,
+ F4FF95D9245B92E800C19C63 /* SliderViewManager.swift in Sources */,
+ 5E555C0D2413F4C50049A1A2 /* SliderViewManager.m in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin XCBuildConfiguration section */
- 28C79A10220DC4CC0061DE82 /* Debug */ = {
+ 58B511ED1A9E6C8500147676 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES;
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_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
+ "EXCLUDED_ARCHS[sdk=*]" = arm64;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
@@ -168,55 +171,49 @@
"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 = 8.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
MTL_ENABLE_DEBUG_INFO = YES;
- MTL_FAST_MATH = YES;
ONLY_ACTIVE_ARCH = YES;
SDKROOT = iphoneos;
};
name = Debug;
};
- 28C79A11220DC4CC0061DE82 /* Release */ = {
+ 58B511EE1A9E6C8500147676 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_SEARCH_USER_PATHS = NO;
- CLANG_ANALYZER_NONNULL = YES;
- CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_ARC = YES;
- CLANG_ENABLE_OBJC_WEAK = 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_DOCUMENTATION_COMMENTS = YES;
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_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
- CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
+ "EXCLUDED_ARCHS[sdk=*]" = arm64;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
@@ -225,54 +222,74 @@
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_VARIABLE = YES;
- IPHONEOS_DEPLOYMENT_TARGET = 8.0;
+ IPHONEOS_DEPLOYMENT_TARGET = 16.0;
MTL_ENABLE_DEBUG_INFO = NO;
- MTL_FAST_MATH = YES;
SDKROOT = iphoneos;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
- 28C79A13220DC4CC0061DE82 /* Debug */ = {
+ 58B511F01A9E6C8500147676 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../node_modules/react-native/React/**",
+ "$(SRCROOT)/../../../React/**",
+ "$(SRCROOT)/../../react-native/React/**",
+ );
+ LIBRARY_SEARCH_PATHS = "$(inherited)";
OTHER_LDFLAGS = "-ObjC";
- PRODUCT_NAME = "$(TARGET_NAME)";
+ PRODUCT_NAME = Slider;
SKIP_INSTALL = YES;
+ SWIFT_OBJC_BRIDGING_HEADER = "Slider-Bridging-Header.h";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ SWIFT_VERSION = 5.0;
};
name = Debug;
};
- 28C79A14220DC4CC0061DE82 /* Release */ = {
+ 58B511F11A9E6C8500147676 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
+ HEADER_SEARCH_PATHS = (
+ "$(inherited)",
+ /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include,
+ "$(SRCROOT)/../node_modules/react-native/React/**",
+ "$(SRCROOT)/../../../React/**",
+ "$(SRCROOT)/../../react-native/React/**",
+ );
+ LIBRARY_SEARCH_PATHS = "$(inherited)";
OTHER_LDFLAGS = "-ObjC";
- PRODUCT_NAME = "$(TARGET_NAME)";
+ PRODUCT_NAME = Slider;
SKIP_INSTALL = YES;
+ SWIFT_OBJC_BRIDGING_HEADER = "Slider-Bridging-Header.h";
+ SWIFT_VERSION = 5.0;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
- 28C79A04220DC4CC0061DE82 /* Build configuration list for PBXProject "RNCSlider" */ = {
+ 58B511D61A9E6C8500147676 /* Build configuration list for PBXProject "Slider" */ = {
isa = XCConfigurationList;
buildConfigurations = (
- 28C79A10220DC4CC0061DE82 /* Debug */,
- 28C79A11220DC4CC0061DE82 /* Release */,
+ 58B511ED1A9E6C8500147676 /* Debug */,
+ 58B511EE1A9E6C8500147676 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
- 28C79A12220DC4CC0061DE82 /* Build configuration list for PBXNativeTarget "RNCSlider" */ = {
+ 58B511EF1A9E6C8500147676 /* Build configuration list for PBXNativeTarget "Slider" */ = {
isa = XCConfigurationList;
buildConfigurations = (
- 28C79A13220DC4CC0061DE82 /* Debug */,
- 28C79A14220DC4CC0061DE82 /* Release */,
+ 58B511F01A9E6C8500147676 /* Debug */,
+ 58B511F11A9E6C8500147676 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
- rootObject = 28C79A01220DC4CC0061DE82 /* Project object */;
+ rootObject = 58B511D31A9E6C8500147676 /* Project object */;
}
diff --git a/package/ios/SliderComponentView.mm b/package/ios/SliderComponentView.mm
new file mode 100644
index 00000000..bc34c4d1
--- /dev/null
+++ b/package/ios/SliderComponentView.mm
@@ -0,0 +1,291 @@
+#import
+#import
+#import
+#import
+#import
+
+#if __has_include("slider-Swift.h")
+#import "slider-Swift.h"
+#elif __has_include("Slider-Swift.h")
+#import "Slider-Swift.h"
+#endif
+
+#import
+#import
+#import
+#import
+
+using namespace facebook::react;
+
+@interface SliderComponentView : RCTViewComponentView
+@end
+
+typedef void (^SliderLoadImageCompletionBlock)(NSError *error, UIImage *image);
+typedef void (^SliderLoadImageFailureBlock)(void);
+
+@implementation SliderComponentView {
+ SliderView *_sliderView;
+}
+
++ (ComponentDescriptorProvider)componentDescriptorProvider
+{
+ return concreteComponentDescriptorProvider();
+}
+
+- (instancetype)initWithFrame:(CGRect)frame
+{
+ if (self = [super initWithFrame:frame]) {
+ static const auto defaultProps = std::make_shared();
+ _props = defaultProps;
+
+ _sliderView = [[SliderView alloc] initWithFrame:self.bounds];
+ __weak __typeof(self) weakSelf = self;
+ _sliderView.onValueChange = ^(NSDictionary *event) {
+ __strong __typeof(self) strongSelf = weakSelf;
+ if (strongSelf == nil) {
+ return;
+ }
+
+ auto eventEmitter = std::static_pointer_cast(strongSelf->_eventEmitter);
+ if (eventEmitter == nullptr) {
+ return;
+ }
+
+ NSNumber *value = event[@"value"];
+ eventEmitter->onValueChange(SliderViewEventEmitter::OnValueChange{
+ .value = value.doubleValue
+ });
+ };
+ _sliderView.onSlidingStart = ^(NSDictionary *event) {
+ __strong __typeof(self) strongSelf = weakSelf;
+ if (strongSelf == nil) {
+ return;
+ }
+
+ auto eventEmitter = std::static_pointer_cast(strongSelf->_eventEmitter);
+ if (eventEmitter == nullptr) {
+ return;
+ }
+
+ NSNumber *value = event[@"value"];
+ eventEmitter->onSlidingStart(SliderViewEventEmitter::OnSlidingStart{
+ .value = value.doubleValue
+ });
+ };
+ _sliderView.onSlidingComplete = ^(NSDictionary *event) {
+ __strong __typeof(self) strongSelf = weakSelf;
+ if (strongSelf == nil) {
+ return;
+ }
+
+ auto eventEmitter = std::static_pointer_cast(strongSelf->_eventEmitter);
+ if (eventEmitter == nullptr) {
+ return;
+ }
+
+ NSNumber *value = event[@"value"];
+ eventEmitter->onSlidingComplete(SliderViewEventEmitter::OnSlidingComplete{
+ .value = value.doubleValue
+ });
+ };
+
+ self.contentView = _sliderView;
+ }
+
+ return self;
+}
+
+- (void)updateProps:(const Props::Shared &)props oldProps:(const Props::Shared &)oldProps
+{
+ const auto &oldSliderProps = *std::static_pointer_cast(_props);
+ const auto &newSliderProps = *std::static_pointer_cast(props);
+
+ if (oldSliderProps.minValue != newSliderProps.minValue) {
+ _sliderView.minValue = newSliderProps.minValue;
+ }
+
+ if (oldSliderProps.maxValue != newSliderProps.maxValue) {
+ _sliderView.maxValue = newSliderProps.maxValue;
+ }
+
+ if (oldSliderProps.step != newSliderProps.step) {
+ _sliderView.step = newSliderProps.step;
+ }
+
+ if (oldSliderProps.value != newSliderProps.value) {
+ _sliderView.value = newSliderProps.value;
+ }
+
+ if (oldSliderProps.lowerLimit != newSliderProps.lowerLimit) {
+ _sliderView.lowerLimit = newSliderProps.lowerLimit;
+ }
+
+ if (oldSliderProps.upperLimit != newSliderProps.upperLimit) {
+ _sliderView.upperLimit = newSliderProps.upperLimit;
+ }
+
+ if (oldSliderProps.disabled != newSliderProps.disabled) {
+ _sliderView.disabled = newSliderProps.disabled;
+ }
+
+ if (oldSliderProps.inverted != newSliderProps.inverted) {
+ _sliderView.inverted = newSliderProps.inverted;
+ }
+
+ if (oldSliderProps.tapToSeek != newSliderProps.tapToSeek) {
+ _sliderView.tapToSeek = newSliderProps.tapToSeek;
+ }
+
+ if (oldSliderProps.minimumTrackTintColor != newSliderProps.minimumTrackTintColor) {
+ _sliderView.minimumTrackTintColor = RCTUIColorFromSharedColor(newSliderProps.minimumTrackTintColor);
+ }
+
+ if (oldSliderProps.maximumTrackTintColor != newSliderProps.maximumTrackTintColor) {
+ _sliderView.maximumTrackTintColor = RCTUIColorFromSharedColor(newSliderProps.maximumTrackTintColor);
+ }
+
+ if (oldSliderProps.thumbTintColor != newSliderProps.thumbTintColor) {
+ _sliderView.thumbTintColor = RCTUIColorFromSharedColor(newSliderProps.thumbTintColor);
+ }
+
+ if (oldSliderProps.thumbSize != newSliderProps.thumbSize) {
+ _sliderView.thumbSize = newSliderProps.thumbSize;
+ }
+
+ if (oldSliderProps.thumbImage != newSliderProps.thumbImage) {
+ [self loadImageFromImageSource:newSliderProps.thumbImage
+ completionBlock:^(__unused NSError *error, UIImage *image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ self->_sliderView.thumbImage = image;
+ });
+ }
+ failureBlock:^{
+ self->_sliderView.thumbImage = nil;
+ }];
+ }
+
+ if (oldSliderProps.trackImage != newSliderProps.trackImage) {
+ [self loadImageFromImageSource:newSliderProps.trackImage
+ completionBlock:^(__unused NSError *error, UIImage *image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ self->_sliderView.trackImage = image;
+ });
+ }
+ failureBlock:^{
+ self->_sliderView.trackImage = nil;
+ }];
+ }
+
+ if (oldSliderProps.minimumTrackImage != newSliderProps.minimumTrackImage) {
+ [self loadImageFromImageSource:newSliderProps.minimumTrackImage
+ completionBlock:^(__unused NSError *error, UIImage *image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ self->_sliderView.minimumTrackImage = image;
+ });
+ }
+ failureBlock:^{
+ self->_sliderView.minimumTrackImage = nil;
+ }];
+ }
+
+ if (oldSliderProps.maximumTrackImage != newSliderProps.maximumTrackImage) {
+ [self loadImageFromImageSource:newSliderProps.maximumTrackImage
+ completionBlock:^(__unused NSError *error, UIImage *image) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ self->_sliderView.maximumTrackImage = image;
+ });
+ }
+ failureBlock:^{
+ self->_sliderView.maximumTrackImage = nil;
+ }];
+ }
+
+ [super updateProps:props oldProps:oldProps];
+}
+
+- (void)loadImageFromImageSource:(ImageSource)source
+ completionBlock:(SliderLoadImageCompletionBlock)completionBlock
+ failureBlock:(SliderLoadImageFailureBlock)failureBlock
+{
+ NSString *uri = [[NSString alloc] initWithUTF8String:source.uri.c_str()];
+ if (!(BOOL)uri.length) {
+ failureBlock();
+ return;
+ }
+
+ NSURL *url = NSURLFromImageSource(source);
+ UIImage *localImage = [self localImageForURL:url uri:uri];
+ if (localImage != nil) {
+ completionBlock(nil, localImage);
+ return;
+ }
+
+ if ([url.scheme isEqualToString:@"http"] || [url.scheme isEqualToString:@"https"]) {
+ NSURLSessionDataTask *task = [NSURLSession.sharedSession
+ dataTaskWithURL:url
+ completionHandler:^(NSData *data, __unused NSURLResponse *response, NSError *error) {
+ UIImage *image = data == nil ? nil : [UIImage imageWithData:data scale:source.scale];
+ if (image != nil) {
+ completionBlock(error, image);
+ } else {
+ failureBlock();
+ }
+ }];
+ [task resume];
+ return;
+ }
+
+ RCTBridge *bridge = [RCTBridge currentBridge];
+ id imageLoader = [bridge moduleForName:@"ImageLoader"];
+ if (imageLoader == nil) {
+ failureBlock();
+ return;
+ }
+
+ [imageLoader loadImageWithURLRequest:NSURLRequestFromImageSource(source)
+ size:CGSizeMake(source.size.width, source.size.height)
+ scale:source.scale
+ clipped:NO
+ resizeMode:RCTResizeModeCover
+ progressBlock:nil
+ partialLoadBlock:nil
+ completionBlock:completionBlock];
+}
+
+- (UIImage *)localImageForURL:(NSURL *)url uri:(NSString *)uri
+{
+ if (url.fileURL) {
+ UIImage *fileImage = [UIImage imageWithContentsOfFile:url.path];
+ if (fileImage != nil) {
+ return fileImage;
+ }
+ }
+
+ NSArray *names = @[
+ uri,
+ uri.lastPathComponent,
+ uri.lastPathComponent.stringByDeletingPathExtension,
+ ];
+
+ for (NSString *name in names) {
+ UIImage *namedImage = [UIImage imageNamed:name];
+ if (namedImage != nil) {
+ return namedImage;
+ }
+
+ NSString *extension = name.pathExtension;
+ NSString *resourceName = extension.length > 0 ? name.stringByDeletingPathExtension : name;
+ NSString *resourcePath = [NSBundle.mainBundle pathForResource:resourceName
+ ofType:extension.length > 0 ? extension : nil];
+ if (resourcePath != nil) {
+ UIImage *resourceImage = [UIImage imageWithContentsOfFile:resourcePath];
+ if (resourceImage != nil) {
+ return resourceImage;
+ }
+ }
+ }
+
+ return nil;
+}
+
+@end
diff --git a/package/ios/SliderView.swift b/package/ios/SliderView.swift
new file mode 100644
index 00000000..32795b62
--- /dev/null
+++ b/package/ios/SliderView.swift
@@ -0,0 +1,607 @@
+import SwiftUI
+import UIKit
+
+struct SliderComponent: View {
+ @ObservedObject var state: SliderState
+
+ private var value: Binding {
+ Binding(
+ get: { state.value },
+ set: { state.setValue($0, notify: true) }
+ )
+ }
+
+ @ViewBuilder
+ private var nativeSlider: some View {
+ if state.step > 0 {
+ Slider(
+ value: value,
+ in: state.valueRange,
+ step: state.step,
+ onEditingChanged: state.setEditing(_:))
+ } else {
+ Slider(
+ value: value,
+ in: state.valueRange,
+ onEditingChanged: state.setEditing(_:))
+ }
+ }
+
+ var body: some View {
+ GeometryReader { geometry in
+ ZStack {
+ nativeSlider
+ .opacity(state.usesCustomVisuals ? 0 : 1)
+ .tint(state.minimumTrackTintColor.map { Color(uiColor: $0) })
+ .environment(\.layoutDirection, state.inverted ? .rightToLeft : .leftToRight)
+ .allowsHitTesting(!state.usesCustomVisuals)
+
+ if state.usesCustomVisuals {
+ SliderVisual(state: state, width: geometry.size.width)
+ }
+ }
+ .disabled(state.disabled)
+ .contentShape(Rectangle())
+ .sliderGesture(
+ state: state,
+ width: geometry.size.width,
+ enabled: state.tapToSeek || state.usesCustomVisuals,
+ minimumDistance: state.tapToSeek ? 0 : 1
+ )
+ }
+ }
+}
+
+private struct SliderVisual: View {
+ @ObservedObject var state: SliderState
+ let width: CGFloat
+
+ private let defaultThumbSize = CGSize(width: 28, height: 28)
+
+ private var trackHeight: CGFloat {
+ let imageHeight = [
+ state.trackImage?.size.height,
+ state.minimumTrackImage?.size.height,
+ state.maximumTrackImage?.size.height,
+ ]
+ .compactMap { $0 }
+ .max() ?? 0
+
+ return max(4, min(imageHeight, 18))
+ }
+
+ private var thumbSize: CGSize {
+ if state.thumbSize > 0 {
+ let size = CGFloat(state.thumbSize)
+ return CGSize(width: size, height: size)
+ }
+
+ if let thumbImage = state.thumbImage {
+ let maxSide = max(thumbImage.size.width, thumbImage.size.height)
+ guard maxSide > 0 else {
+ return defaultThumbSize
+ }
+
+ let scale = min(1, defaultThumbSize.width / maxSide)
+ return CGSize(width: thumbImage.size.width * scale, height: thumbImage.size.height * scale)
+ }
+
+ return defaultThumbSize
+ }
+
+ var body: some View {
+ let percent = state.visualPercent
+ let resolvedThumbSize = thumbSize
+ let trackInset = resolvedThumbSize.width / 2
+ let trackWidth = max(width - resolvedThumbSize.width, 0)
+ let thumbCenterX = trackInset + trackWidth * percent
+ let progressWidth = state.inverted ? trackWidth * (1 - percent) : trackWidth * percent
+ let progressOffset = state.inverted ? trackWidth - progressWidth : 0
+
+ ZStack(alignment: .leading) {
+ ZStack(alignment: .leading) {
+ SliderTrackSegment(
+ width: trackWidth,
+ height: trackHeight,
+ color: state.maximumTrackTintColor ?? UIColor.systemGray4,
+ image: state.maximumTrackVisualImage
+ )
+
+ SliderTrackSegment(
+ width: progressWidth,
+ height: trackHeight,
+ color: state.minimumTrackTintColor ?? UIColor.systemBlue,
+ image: state.minimumTrackVisualImage
+ )
+ .offset(x: progressOffset)
+ }
+ .frame(width: trackWidth, height: trackHeight, alignment: .leading)
+ .clipShape(Capsule())
+ .offset(x: trackInset)
+
+ SliderThumb(
+ color: state.thumbTintColor ?? UIColor.white,
+ image: state.thumbImage,
+ size: resolvedThumbSize
+ )
+ .offset(x: thumbCenterX - resolvedThumbSize.width / 2)
+ }
+ .frame(width: width, height: max(resolvedThumbSize.height, trackHeight), alignment: .center)
+ }
+}
+
+private struct SliderTrackImage {
+ let image: UIImage
+ let leftCap: CGFloat
+ let rightCap: CGFloat
+}
+
+private struct SliderTrackSegment: View {
+ let width: CGFloat
+ let height: CGFloat
+ let color: UIColor
+ let image: SliderTrackImage?
+
+ var body: some View {
+ let resolvedWidth = max(width, 0)
+
+ Group {
+ if let image {
+ Image(
+ uiImage: image.image.renderedSliderTrackImage(
+ width: resolvedWidth,
+ height: height,
+ leftCap: image.leftCap,
+ rightCap: image.rightCap
+ )
+ )
+ } else {
+ Color(uiColor: color)
+ }
+ }
+ .frame(width: resolvedWidth, height: height)
+ }
+}
+
+private struct SliderThumb: View {
+ let color: UIColor
+ let image: UIImage?
+ let size: CGSize
+
+ private var shadowOpacity: Double {
+ color.cgColor.alpha > 0 ? 0.12 : 0
+ }
+
+ var body: some View {
+ Group {
+ if let image {
+ Image(uiImage: image)
+ .resizable()
+ } else {
+ Circle()
+ .fill(Color(uiColor: color))
+ .shadow(color: Color.black.opacity(shadowOpacity), radius: 4, x: 0, y: 1)
+ }
+ }
+ .frame(width: size.width, height: size.height)
+ }
+}
+
+private extension View {
+ @ViewBuilder
+ func sliderGesture(state: SliderState, width: CGFloat, enabled: Bool, minimumDistance: CGFloat) -> some View {
+ if enabled {
+ gesture(
+ DragGesture(minimumDistance: minimumDistance)
+ .onChanged { gesture in
+ guard !state.disabled else {
+ return
+ }
+
+ state.setEditing(true)
+ state.setValueFromLocation(
+ x: gesture.location.x,
+ width: width,
+ inset: state.gestureInset(for: width)
+ )
+ }
+ .onEnded { _ in
+ state.setEditing(false)
+ }
+ )
+ } else {
+ self
+ }
+ }
+}
+
+class SliderState: ObservableObject {
+ @Published var value: Double = 0
+ @Published var minValue: Double = 0
+ @Published var maxValue: Double = 1
+ @Published var step: Double = 0
+ @Published var lowerLimit: Double = -Double.greatestFiniteMagnitude
+ @Published var upperLimit: Double = Double.greatestFiniteMagnitude
+ @Published var disabled: Bool = false
+ @Published var inverted: Bool = false
+ @Published var tapToSeek: Bool = false
+ @Published var minimumTrackTintColor: UIColor?
+ @Published var maximumTrackTintColor: UIColor?
+ @Published var thumbTintColor: UIColor?
+ @Published var thumbImage: UIImage?
+ @Published var thumbSize: Double = 0
+ @Published var trackImage: UIImage?
+ @Published var minimumTrackImage: UIImage?
+ @Published var maximumTrackImage: UIImage?
+
+ var onValueChange: RCTDirectEventBlock?
+ var onSlidingStart: RCTDirectEventBlock?
+ var onSlidingComplete: RCTDirectEventBlock?
+
+ private var isEditing = false
+
+ var valueRange: ClosedRange {
+ minValue...max(minValue, maxValue)
+ }
+
+ var usesCustomVisuals: Bool {
+ maximumTrackTintColor != nil ||
+ thumbTintColor != nil ||
+ thumbImage != nil ||
+ thumbSize > 0 ||
+ trackImage != nil ||
+ minimumTrackImage != nil ||
+ maximumTrackImage != nil
+ }
+
+ fileprivate var minimumTrackVisualImage: SliderTrackImage? {
+ if let minimumTrackImage {
+ return SliderTrackImage(image: minimumTrackImage, leftCap: minimumTrackImage.size.width - 1, rightCap: 0)
+ }
+
+ if let trackImage {
+ let capWidth = floor((trackImage.size.width - 1) / 2)
+ return SliderTrackImage(image: trackImage, leftCap: capWidth, rightCap: capWidth)
+ }
+
+ return nil
+ }
+
+ fileprivate var maximumTrackVisualImage: SliderTrackImage? {
+ if let maximumTrackImage {
+ return SliderTrackImage(image: maximumTrackImage, leftCap: 0, rightCap: maximumTrackImage.size.width - 1)
+ }
+
+ if let trackImage {
+ let capWidth = floor((trackImage.size.width - 1) / 2)
+ return SliderTrackImage(image: trackImage, leftCap: capWidth, rightCap: capWidth)
+ }
+
+ return nil
+ }
+
+ var visualPercent: CGFloat {
+ guard maxValue > minValue else {
+ return inverted ? 1 : 0
+ }
+
+ let percent = min(max((value - minValue) / (maxValue - minValue), 0), 1)
+ return CGFloat(inverted ? 1 - percent : percent)
+ }
+
+ func setMinValue(_ nextValue: Double) {
+ minValue = nextValue
+ normalizeRange()
+ clampValue()
+ }
+
+ func setMaxValue(_ nextValue: Double) {
+ maxValue = nextValue
+ normalizeRange()
+ clampValue()
+ }
+
+ func setStep(_ nextValue: Double) {
+ step = max(nextValue, 0)
+ clampValue()
+ }
+
+ func setValue(_ nextValue: Double, notify: Bool) {
+ let nextValue = clampedValue(snappedValue(nextValue))
+
+ if value != nextValue {
+ value = nextValue
+ }
+
+ if notify {
+ onValueChange?(eventPayload())
+ }
+ }
+
+ func setEditing(_ editing: Bool) {
+ guard editing != isEditing else {
+ return
+ }
+
+ isEditing = editing
+
+ if editing {
+ onSlidingStart?(eventPayload())
+ } else {
+ onSlidingComplete?(eventPayload())
+ }
+ }
+
+ func gestureInset(for width: CGFloat) -> CGFloat {
+ if thumbSize > 0 {
+ return min(CGFloat(thumbSize) / 2, width / 2)
+ }
+
+ if let thumbImage {
+ return min(thumbImage.size.width / 2, width / 2)
+ }
+
+ return usesCustomVisuals ? min(14, width / 2) : 0
+ }
+
+ func setValueFromLocation(x: CGFloat, width: CGFloat, inset: CGFloat = 0) {
+ guard !disabled else {
+ return
+ }
+
+ let usableWidth = max(width - inset * 2, 1)
+ let percent = min(max(Double((x - inset) / usableWidth), 0), 1)
+ let directedPercent = inverted ? 1 - percent : percent
+ let nextValue = minValue + directedPercent * (maxValue - minValue)
+ setValue(nextValue, notify: true)
+ }
+
+ private func normalizeRange() {
+ if maxValue < minValue {
+ maxValue = minValue
+ }
+ }
+
+ private func clampValue() {
+ setValue(value, notify: false)
+ }
+
+ private func clampedValue(_ nextValue: Double) -> Double {
+ let lower = max(minValue, lowerLimit)
+ let upper = min(maxValue, upperLimit)
+ return min(max(nextValue, lower), max(lower, upper))
+ }
+
+ private func snappedValue(_ nextValue: Double) -> Double {
+ guard step > 0 else {
+ return nextValue
+ }
+
+ return minValue + round((nextValue - minValue) / step) * step
+ }
+
+ private func eventPayload() -> [String: Any] {
+ ["value": value]
+ }
+}
+
+private extension UIImage {
+ func renderedSliderTrackImage(width: CGFloat, height: CGFloat, leftCap: CGFloat, rightCap: CGFloat) -> UIImage {
+ let targetSize = CGSize(width: max(width, 1), height: max(height, 1))
+ let imageWidth = max(size.width, 1)
+ let sourceLeftCap = min(max(leftCap, 0), imageWidth)
+ let sourceRightCap = min(max(rightCap, 0), imageWidth - sourceLeftCap)
+ let sourceCenterWidth = max(imageWidth - sourceLeftCap - sourceRightCap, 0)
+
+ let targetLeftCap = min(sourceLeftCap, targetSize.width)
+ let targetRightCap = min(sourceRightCap, max(targetSize.width - targetLeftCap, 0))
+ let targetCenterWidth = max(targetSize.width - targetLeftCap - targetRightCap, 0)
+
+ let format = UIGraphicsImageRendererFormat()
+ format.scale = UIScreen.main.scale
+ format.opaque = false
+
+ return UIGraphicsImageRenderer(size: targetSize, format: format).image { _ in
+ drawSliderTrackSlice(
+ sourceX: 0,
+ sourceWidth: sourceLeftCap,
+ destination: CGRect(x: 0, y: 0, width: targetLeftCap, height: targetSize.height)
+ )
+
+ drawSliderTrackSlice(
+ sourceX: sourceLeftCap,
+ sourceWidth: sourceCenterWidth,
+ destination: CGRect(x: targetLeftCap, y: 0, width: targetCenterWidth, height: targetSize.height)
+ )
+
+ drawSliderTrackSlice(
+ sourceX: imageWidth - sourceRightCap,
+ sourceWidth: sourceRightCap,
+ destination: CGRect(
+ x: targetSize.width - targetRightCap,
+ y: 0,
+ width: targetRightCap,
+ height: targetSize.height
+ )
+ )
+ }
+ }
+
+ private func drawSliderTrackSlice(sourceX: CGFloat, sourceWidth: CGFloat, destination: CGRect) {
+ guard sourceWidth > 0, destination.width > 0, destination.height > 0 else {
+ return
+ }
+
+ guard let cgImage else {
+ draw(in: destination)
+ return
+ }
+
+ let scaleX = CGFloat(cgImage.width) / max(size.width, 1)
+ let sourceRect = CGRect(
+ x: sourceX * scaleX,
+ y: 0,
+ width: sourceWidth * scaleX,
+ height: CGFloat(cgImage.height)
+ )
+ .integral
+
+ guard let slice = cgImage.cropping(to: sourceRect) else {
+ draw(in: destination)
+ return
+ }
+
+ UIImage(cgImage: slice, scale: scale, orientation: imageOrientation).draw(in: destination)
+ }
+}
+
+@objc(SliderView)
+public class SliderView: UIView {
+ private let state = SliderState()
+ private var hostingController: UIHostingController?
+
+ @objc public var minValue: Double = 0 {
+ didSet {
+ state.setMinValue(minValue)
+ }
+ }
+
+ @objc public var maxValue: Double = 1 {
+ didSet {
+ state.setMaxValue(maxValue)
+ }
+ }
+
+ @objc public var step: Double = 0 {
+ didSet {
+ state.setStep(step)
+ }
+ }
+
+ @objc public var value: Double = 0 {
+ didSet {
+ state.setValue(value, notify: false)
+ }
+ }
+
+ @objc public var lowerLimit: Double = -Double.greatestFiniteMagnitude {
+ didSet {
+ state.lowerLimit = lowerLimit
+ state.setValue(state.value, notify: false)
+ }
+ }
+
+ @objc public var upperLimit: Double = Double.greatestFiniteMagnitude {
+ didSet {
+ state.upperLimit = upperLimit
+ state.setValue(state.value, notify: false)
+ }
+ }
+
+ @objc public var disabled: Bool = false {
+ didSet {
+ state.disabled = disabled
+ }
+ }
+
+ @objc public var inverted: Bool = false {
+ didSet {
+ state.inverted = inverted
+ }
+ }
+
+ @objc public var tapToSeek: Bool = false {
+ didSet {
+ state.tapToSeek = tapToSeek
+ }
+ }
+
+ @objc public var minimumTrackTintColor: UIColor? {
+ didSet {
+ state.minimumTrackTintColor = minimumTrackTintColor
+ }
+ }
+
+ @objc public var maximumTrackTintColor: UIColor? {
+ didSet {
+ state.maximumTrackTintColor = maximumTrackTintColor
+ }
+ }
+
+ @objc public var thumbTintColor: UIColor? {
+ didSet {
+ state.thumbTintColor = thumbTintColor
+ }
+ }
+
+ @objc public var thumbImage: UIImage? {
+ didSet {
+ state.thumbImage = thumbImage
+ }
+ }
+
+ @objc public var thumbSize: Double = 0 {
+ didSet {
+ state.thumbSize = thumbSize
+ }
+ }
+
+ @objc public var trackImage: UIImage? {
+ didSet {
+ state.trackImage = trackImage
+ }
+ }
+
+ @objc public var minimumTrackImage: UIImage? {
+ didSet {
+ state.minimumTrackImage = minimumTrackImage
+ }
+ }
+
+ @objc public var maximumTrackImage: UIImage? {
+ didSet {
+ state.maximumTrackImage = maximumTrackImage
+ }
+ }
+
+ @objc public var onValueChange: RCTDirectEventBlock? {
+ didSet {
+ state.onValueChange = onValueChange
+ }
+ }
+
+ @objc public var onSlidingStart: RCTDirectEventBlock? {
+ didSet {
+ state.onSlidingStart = onSlidingStart
+ }
+ }
+
+ @objc public var onSlidingComplete: RCTDirectEventBlock? {
+ didSet {
+ state.onSlidingComplete = onSlidingComplete
+ }
+ }
+
+ public override init(frame: CGRect) {
+ super.init(frame: frame)
+
+ clipsToBounds = false
+ layer.masksToBounds = false
+
+ let hostingController = UIHostingController(rootView: SliderComponent(state: state))
+ hostingController.view.backgroundColor = .clear
+ hostingController.view.clipsToBounds = false
+ hostingController.view.layer.masksToBounds = false
+ addSubview(hostingController.view)
+ self.hostingController = hostingController
+ }
+
+ public required init?(coder: NSCoder) {
+ fatalError("init(coder:) has not been implemented")
+ }
+
+ public override func layoutSubviews() {
+ super.layoutSubviews()
+ hostingController?.view.frame = bounds
+ }
+}
diff --git a/package/ios/SliderViewManager.m b/package/ios/SliderViewManager.m
new file mode 100644
index 00000000..93cacc2f
--- /dev/null
+++ b/package/ios/SliderViewManager.m
@@ -0,0 +1,26 @@
+#import "RCTViewManager.h"
+
+@interface RCT_EXTERN_MODULE(SliderViewManager, RCTViewManager)
+
+RCT_EXPORT_VIEW_PROPERTY(minValue, double)
+RCT_EXPORT_VIEW_PROPERTY(maxValue, double)
+RCT_EXPORT_VIEW_PROPERTY(step, double)
+RCT_EXPORT_VIEW_PROPERTY(value, double)
+RCT_EXPORT_VIEW_PROPERTY(lowerLimit, double)
+RCT_EXPORT_VIEW_PROPERTY(upperLimit, double)
+RCT_EXPORT_VIEW_PROPERTY(disabled, BOOL)
+RCT_EXPORT_VIEW_PROPERTY(inverted, BOOL)
+RCT_EXPORT_VIEW_PROPERTY(tapToSeek, BOOL)
+RCT_EXPORT_VIEW_PROPERTY(minimumTrackTintColor, UIColor)
+RCT_EXPORT_VIEW_PROPERTY(maximumTrackTintColor, UIColor)
+RCT_EXPORT_VIEW_PROPERTY(thumbTintColor, UIColor)
+RCT_EXPORT_VIEW_PROPERTY(thumbImage, UIImage)
+RCT_EXPORT_VIEW_PROPERTY(thumbSize, double)
+RCT_EXPORT_VIEW_PROPERTY(trackImage, UIImage)
+RCT_EXPORT_VIEW_PROPERTY(minimumTrackImage, UIImage)
+RCT_EXPORT_VIEW_PROPERTY(maximumTrackImage, UIImage)
+RCT_EXPORT_VIEW_PROPERTY(onValueChange, RCTDirectEventBlock)
+RCT_EXPORT_VIEW_PROPERTY(onSlidingStart, RCTDirectEventBlock)
+RCT_EXPORT_VIEW_PROPERTY(onSlidingComplete, RCTDirectEventBlock)
+
+@end
diff --git a/package/ios/SliderViewManager.swift b/package/ios/SliderViewManager.swift
new file mode 100644
index 00000000..06b8a01a
--- /dev/null
+++ b/package/ios/SliderViewManager.swift
@@ -0,0 +1,13 @@
+import UIKit
+
+@objc(SliderViewManager)
+class SliderViewManager: RCTViewManager {
+
+ override func view() -> UIView! {
+ return SliderView()
+ }
+
+ @objc override static func requiresMainQueueSetup() -> Bool {
+ return false
+ }
+}
diff --git a/package/ios/slider.h b/package/ios/slider.h
new file mode 100644
index 00000000..aa06e866
--- /dev/null
+++ b/package/ios/slider.h
@@ -0,0 +1,2 @@
+#import
+#import
diff --git a/package/package.json b/package/package.json
index 63179687..87985b69 100644
--- a/package/package.json
+++ b/package/package.json
@@ -2,7 +2,7 @@
"name": "@react-native-community/slider",
"version": "5.2.0",
"license": "MIT",
- "author": "react-native-community",
+ "author": "Callstack",
"homepage": "https://github.com/callstack/react-native-slider#readme",
"description": "React Native component used to select a single value from a range of values.",
"publishConfig": {
@@ -16,8 +16,8 @@
"slider"
],
"scripts": {
- "prepare": "babel --extensions \".ts,.tsx\" --out-dir dist src",
- "lint": "npx eslint src __test__",
+ "prepare": "node -e \"require('fs').rmSync('dist',{recursive:true,force:true})\" && babel --extensions \".ts,.tsx\" --out-dir dist src",
+ "lint": "npx eslint src",
"test": "jest",
"prepack": "npx copyfiles \"./../README.md\" ./README.md"
},
@@ -60,6 +60,7 @@
"jest": {
"preset": "react-native",
"verbose": true,
+ "watchman": false,
"modulePathIgnorePatterns": [
"/e2e/"
]
@@ -71,15 +72,15 @@
"jsxBracketSameLine": true
},
"codegenConfig": {
- "name": "RNCSlider",
+ "name": "Slider",
"type": "components",
"jsSrcsDir": "src",
"android": {
- "javaPackageName": "com.reactnativecommunity.slider"
+ "javaPackageName": "com.callstack.slider"
},
"ios": {
"componentProvider": {
- "RNCSlider": "RNCSliderComponentView"
+ "SliderView": "SliderComponentView"
}
}
}
diff --git a/package/react-native-slider.podspec b/package/react-native-slider.podspec
index b795d531..67c781fb 100644
--- a/package/react-native-slider.podspec
+++ b/package/react-native-slider.podspec
@@ -1,34 +1,32 @@
-require 'json'
+require "json"
-package = JSON.parse(File.read(File.join(__dir__, 'package.json')))
+package = JSON.parse(File.read(File.join(__dir__, "package.json")))
+folly_compiler_flags = "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32"
Pod::Spec.new do |s|
s.name = "react-native-slider"
- s.version = package['version']
- s.summary = package['description']
- s.license = package['license']
+ s.version = package["version"]
+ s.summary = package["description"]
+ s.license = package["license"]
- s.authors = package['author']
- s.homepage = package['homepage']
- s.platforms = { :ios => "9.0", :visionos => "1.0" }
+ s.authors = package["author"]
+ s.homepage = package["homepage"]
+ s.platforms = { :ios => "16.0" }
s.source = { :git => "https://github.com/callstack/react-native-slider.git", :tag => "v#{s.version}" }
- s.source_files = "ios/**/*.{h,m,mm}"
- s.subspec "common" do |ss|
- ss.source_files = "common/cpp/**/*.{cpp,h}"
- ss.pod_target_xcconfig = { "HEADER_SEARCH_PATHS" => "\"$(PODS_TARGET_SRCROOT)/common/cpp\"" }
- end
+ s.source_files = "ios/**/*.{h,m,mm,swift}"
+
+ s.dependency "React-Core"
if defined?(install_modules_dependencies)
install_modules_dependencies(s)
else
- s.dependency 'React-Core'
- s.compiler_flags = "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1 -Wno-comma -Wno-shorten-64-to-32 -DRCT_NEW_ARCH_ENABLED=1"
- s.pod_target_xcconfig = {
- "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
- "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
- "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
+ s.compiler_flags = folly_compiler_flags + " -DRCT_NEW_ARCH_ENABLED=1"
+ s.pod_target_xcconfig = {
+ "HEADER_SEARCH_PATHS" => "\"$(PODS_ROOT)/boost\"",
+ "OTHER_CPLUSPLUSFLAGS" => "-DFOLLY_NO_CONFIG -DFOLLY_MOBILE=1 -DFOLLY_USE_LIBCPP=1",
+ "CLANG_CXX_LANGUAGE_STANDARD" => "c++17"
}
s.dependency "React-RCTFabric"
s.dependency "React-Codegen"
diff --git a/package/react-native.config.js b/package/react-native.config.js
index ffcb1e61..97d077e1 100644
--- a/package/react-native.config.js
+++ b/package/react-native.config.js
@@ -2,8 +2,8 @@ module.exports = {
dependency: {
platforms: {
android: {
- libraryName: 'RNCSlider',
- componentDescriptors: ['RNCSliderComponentDescriptor'],
+ libraryName: 'Slider',
+ componentDescriptors: ['SliderViewComponentDescriptor'],
cmakeListsPath: 'src/main/jni/CMakeLists.txt',
},
},
diff --git a/package/src/RNCSliderNativeComponent.web.tsx b/package/src/RNCSliderNativeComponent.web.tsx
deleted file mode 100644
index e11e1853..00000000
--- a/package/src/RNCSliderNativeComponent.web.tsx
+++ /dev/null
@@ -1,398 +0,0 @@
-import React, {RefObject, useCallback} from 'react';
-import {
- Animated,
- View,
- ColorValue,
- ViewStyle,
- GestureResponderEvent,
- LayoutChangeEvent,
- Image,
- ImageSourcePropType,
-} from 'react-native';
-//@ts-ignore
-import type {ImageSource} from 'react-native/Libraries/Image/ImageSource';
-import {constants} from './utils/constants';
-
-type Event = Readonly<{
- nativeEvent: {
- value: number;
- };
-}>;
-
-type AnimationValues = {
- val: Animated.Value;
- min: Animated.Value;
- max: Animated.Value;
- diff: Animated.Value;
-};
-
-export interface Props {
- value: number;
- minimumValue: number;
- maximumValue: number;
- lowerLimit?: number;
- upperLimit?: number;
- step: number;
- minimumTrackTintColor: ColorValue;
- maximumTrackTintColor: ColorValue;
- thumbTintColor: ColorValue;
- thumbStyle: ViewStyle;
- style: ViewStyle;
- inverted: boolean;
- disabled: boolean;
- trackHeight: number;
- thumbImage?: ImageSource;
- onRNCSliderSlidingStart: (event: Event) => void;
- onRNCSliderSlidingComplete: (event: Event) => void;
- onRNCSliderValueChange: (event: Event) => void;
-}
-
-const valueToEvent = (value: number): Event => ({nativeEvent: {value}});
-
-const RCTSliderWebComponent = React.forwardRef(
- (
- {
- value: initialValue = 0,
- minimumValue = 0,
- maximumValue = 0,
- lowerLimit = 0,
- upperLimit = 0,
- step = 1,
- minimumTrackTintColor = '#009688',
- maximumTrackTintColor = '#939393',
- thumbTintColor = '#009688',
- thumbStyle = {},
- style = {},
- inverted = false,
- disabled = false,
- trackHeight = 4,
- thumbImage,
- onRNCSliderSlidingStart = (_: Event) => {},
- onRNCSliderSlidingComplete = (_: Event) => {},
- onRNCSliderValueChange = (_: Event) => {},
- ...others
- }: Props,
- forwardedRef: any,
- ) => {
- const containerSize = React.useRef({width: 0, height: 0});
- const containerPositionX = React.useRef(0);
- const containerRef = forwardedRef || React.createRef();
- const containerPositionInvalidated = React.useRef(false);
- const [value, setValue] = React.useState(initialValue || minimumValue);
- const lastInitialValue = React.useRef(0);
- const animationValues = React.useRef({
- val: new Animated.Value(value),
- min: new Animated.Value(minimumValue),
- max: new Animated.Value(maximumValue),
- // make sure we never divide by 0
- diff: new Animated.Value(maximumValue - minimumValue || 1),
- }).current;
-
- // update minimumValue & maximumValue animations
- React.useEffect(() => {
- animationValues.min.setValue(minimumValue);
- animationValues.max.setValue(maximumValue);
- // make sure we never divide by 0
- animationValues.diff.setValue(maximumValue - minimumValue || 1);
- }, [animationValues, minimumValue, maximumValue]);
-
- // compute animated slider position based on animated value
- const minPercent = React.useRef(
- Animated.multiply(
- new Animated.Value(100),
- Animated.divide(
- Animated.subtract(animationValues.val, animationValues.min),
- animationValues.diff,
- ),
- ),
- ).current;
- const maxPercent = React.useRef(
- Animated.subtract(new Animated.Value(100), minPercent),
- ).current;
-
- const onValueChange = useCallback(
- (value: number) => {
- onRNCSliderValueChange && onRNCSliderValueChange(valueToEvent(value));
- },
- [onRNCSliderValueChange],
- );
-
- const onSlidingStart = useCallback(
- (value: number) => {
- isUserInteracting.current = true;
- onRNCSliderSlidingStart && onRNCSliderSlidingStart(valueToEvent(value));
- },
- [onRNCSliderSlidingStart],
- );
-
- const onSlidingComplete = useCallback(
- (value: number) => {
- isUserInteracting.current = false;
- onRNCSliderSlidingComplete &&
- onRNCSliderSlidingComplete(valueToEvent(value));
- },
- [onRNCSliderSlidingComplete],
- );
- // Add a ref to track user interaction
- const isUserInteracting = React.useRef(false);
- const updateValue = useCallback(
- (newValue: number) => {
- // Ensure that the value is correctly rounded
- const hardRounded =
- decimalPrecision.current < 20
- ? Number.parseFloat(newValue.toFixed(decimalPrecision.current))
- : newValue;
-
- // Ensure that the new value is still between the bounds
- const withinBounds = Math.max(
- minimumValue,
- Math.min(hardRounded, maximumValue),
- );
- if (value !== withinBounds) {
- setValue(withinBounds);
- if (isUserInteracting.current) {
- onValueChange(withinBounds);
- }
- return withinBounds;
- }
- return hardRounded;
- },
- [minimumValue, maximumValue, value, onValueChange],
- );
-
- React.useLayoutEffect(() => {
- // we have to do this check because `initialValue` gets default to `0` by
- // Slider. If we don't this will get called every time `value` changes
- // as `updateValue` is mutated when value changes. The result of not
- // checking this is that the value constantly gets reset to `0` in
- // contexts where `value` is not managed externally.
- if (initialValue !== lastInitialValue.current) {
- lastInitialValue.current = initialValue;
- const newValue = updateValue(initialValue);
- animationValues.val.setValue(newValue);
- }
- }, [initialValue, updateValue, animationValues]);
-
- React.useEffect(() => {
- const invalidateContainerPosition = () => {
- containerPositionInvalidated.current = true;
- };
- const onDocumentScroll = (e: Event) => {
- const isAlreadyInvalidated = !containerPositionInvalidated.current;
- if (
- isAlreadyInvalidated &&
- containerRef.current &&
- // @ts-ignore
- e.target.contains(containerRef.current)
- ) {
- invalidateContainerPosition();
- }
- };
- //@ts-ignore
- window.addEventListener('resize', invalidateContainerPosition);
- //@ts-ignore
- document.addEventListener('scroll', onDocumentScroll, {capture: true});
-
- return () => {
- //@ts-ignore
- window.removeEventListener('resize', invalidateContainerPosition);
-
- //@ts-ignore
- document.removeEventListener('scroll', onDocumentScroll, {
- capture: true,
- });
- };
- }, [containerRef]);
-
- const containerStyle = [
- {
- flexGrow: 1,
- flexShrink: 1,
- flexBasis: 'auto',
- flexDirection: 'row',
- alignItems: 'center',
- },
- style,
- ] as ViewStyle[];
-
- const trackStyle = {
- height: trackHeight,
- borderRadius: trackHeight / 2,
- userSelect: 'none',
- };
-
- const minimumTrackStyle = {
- ...trackStyle,
- backgroundColor: minimumTrackTintColor,
- flexGrow: minPercent,
- };
-
- const maximumTrackStyle = {
- ...trackStyle,
- backgroundColor: maximumTrackTintColor,
- flexGrow: maxPercent,
- };
-
- const thumbSize = constants.THUMB_SIZE;
- const thumbViewStyle = [
- {
- width: thumbSize,
- height: thumbSize,
- backgroundColor: thumbTintColor,
- zIndex: 1,
- borderRadius: thumbSize / 2,
- overflow: 'hidden',
- },
- thumbStyle,
- ] as ViewStyle[];
-
- const decimalPrecision = React.useRef(
- calculatePrecision(minimumValue, maximumValue, step),
- );
- React.useEffect(() => {
- decimalPrecision.current = calculatePrecision(
- minimumValue,
- maximumValue,
- step,
- );
- }, [maximumValue, minimumValue, step]);
-
- const updateContainerPositionX = () => {
- const positionX = (
- containerRef as RefObject
- ).current?.getBoundingClientRect().x;
- containerPositionX.current = positionX ?? 0;
- };
-
- const getValueFromNativeEvent = (pageX: number) => {
- const adjustForThumbSize = (containerSize.current.width || 1) > thumbSize;
- const width =
- (containerSize.current.width || 1) -
- (adjustForThumbSize ? thumbSize : 0);
-
- if (containerPositionInvalidated.current) {
- containerPositionInvalidated.current = false;
- updateContainerPositionX();
- }
-
- const containerX =
- containerPositionX.current + (adjustForThumbSize ? thumbSize / 2 : 0);
- const lowerValue = minimumValue < lowerLimit ? lowerLimit : minimumValue;
- const upperValue = maximumValue > upperLimit ? upperLimit : maximumValue;
-
- if (pageX < containerX) {
- return inverted ? upperValue : lowerValue;
- } else if (pageX > containerX + width) {
- return inverted ? lowerValue : upperValue;
- } else {
- const x = pageX - containerX;
- const newValue = inverted
- ? maximumValue - ((maximumValue - minimumValue) * x) / width
- : minimumValue + ((maximumValue - minimumValue) * x) / width;
-
- const valueAfterStep = step
- ? Math.round(newValue / step) * step
- : newValue;
- const valueAfterLowerLimit =
- valueAfterStep < lowerLimit ? lowerLimit : valueAfterStep;
- const valueInLimitRange =
- valueAfterLowerLimit > upperLimit ? upperLimit : valueAfterLowerLimit;
- return valueInLimitRange;
- }
- };
-
- const onTouchEnd = ({nativeEvent}: GestureResponderEvent) => {
- const newValue = updateValue(getValueFromNativeEvent(nativeEvent.pageX));
- animationValues.val.setValue(newValue);
- onSlidingComplete(newValue);
- };
-
- const onMove = ({nativeEvent}: GestureResponderEvent) => {
- const newValue = getValueFromNativeEvent(nativeEvent.pageX);
- animationValues.val.setValue(newValue);
- updateValue(newValue);
- };
-
- const accessibilityActions = (event: any) => {
- const tenth = (maximumValue - minimumValue) / 10;
- switch (event.nativeEvent.actionName) {
- case 'increment':
- updateValue(value + (step || tenth));
- break;
- case 'decrement':
- updateValue(value - (step || tenth));
- break;
- }
- };
-
- React.useImperativeHandle(
- forwardedRef,
- () => ({
- updateValue: (val: number) => {
- updateValue(val);
- },
- }),
- [updateValue],
- );
-
- return (
- {
- containerSize.current.height = layout.height;
- containerSize.current.width = layout.width;
- if ((containerRef as RefObject).current) {
- updateContainerPositionX();
- }
- }}
- accessibilityActions={[
- {name: 'increment', label: 'increment'},
- {name: 'decrement', label: 'decrement'},
- ]}
- onAccessibilityAction={accessibilityActions}
- accessible={true}
- accessibilityRole={'adjustable'}
- style={containerStyle}
- {...others}
- // NOTE: gesture responders should all fall _after_ the {...others}
- // spread operator, or they may not work appropriately.
- onStartShouldSetResponder={() => !disabled}
- onMoveShouldSetResponder={() => !disabled}
- onResponderGrant={() => onSlidingStart(value)}
- onResponderRelease={onTouchEnd}
- onResponderMove={onMove}>
-
-
- {thumbImage !== undefined ? (
-
- ) : null}
-
-
-
- );
- },
-);
-
-// We should round number with the same precision as the min, max or step values if provided
-function calculatePrecision(
- minimumValue: number,
- maximumValue: number,
- step: number,
-) {
- if (!step) {
- return Infinity;
- } else {
- // Calculate the number of decimals we can encounter in the results
- const decimals = [minimumValue, maximumValue, step].map(
- (value) => ((value + '').split('.').pop() || '').length,
- );
- return Math.max(...decimals);
- }
-}
-
-RCTSliderWebComponent.displayName = 'RTCSliderWebComponent';
-
-export default RCTSliderWebComponent;
diff --git a/package/src/Slider.tsx b/package/src/Slider.tsx
index c452ef9c..defb5663 100644
--- a/package/src/Slider.tsx
+++ b/package/src/Slider.tsx
@@ -1,356 +1,312 @@
-import React, {useEffect, useState} from 'react';
+import React, {useCallback, useEffect, useMemo, useState} from 'react';
import {
+ AccessibilityActionEvent,
Image,
+ type ColorValue,
Platform,
- AccessibilityActionEvent,
- ViewProps,
- ViewStyle,
- ColorValue,
- NativeSyntheticEvent,
- StyleProp,
+ StyleSheet,
+ type NativeSyntheticEvent,
+ type ImageSource,
+ type ImageSourcePropType,
+ type StyleProp,
View,
- ImageSource,
- ImageSourcePropType,
+ type ViewProps,
+ type ViewStyle,
} from 'react-native';
-import RCTSliderNativeComponent from './index';
-import type {FC, Ref} from 'react';
-import {MarkerProps} from './components/TrackMark';
+import SliderNativeComponent, {
+ type NativeSliderProps,
+ type SliderChangeEvent,
+} from './SliderNativeComponent';
import {StepsIndicator} from './components/StepsIndicator';
-import {styles} from './utils/styles';
+import type {MarkerProps} from './components/TrackMark';
import {constants} from './utils/constants';
-
-type Event = NativeSyntheticEvent<
- Readonly<{
- value: number;
- /**
- * Android Only.
- */
- fromUser?: boolean;
- }>
->;
-
-type WindowsProps = Readonly<{
- /**
- * If true the slider will be inverted.
- * Default value is false.
- */
- vertical?: boolean;
-}>;
+import {styles as sliderStyles} from './utils/styles';
type IOSProps = Readonly<{
- /**
- * Assigns a single image for the track. Only static images are supported.
- * The center pixel of the image will be stretched to fill the track.
- */
trackImage?: ImageSource;
-
- /**
- * Assigns a minimum track image. Only static images are supported. The
- * rightmost pixel of the image will be stretched to fill the track.
- */
minimumTrackImage?: ImageSource;
-
- /**
- * Assigns a maximum track image. Only static images are supported. The
- * leftmost pixel of the image will be stretched to fill the track.
- */
maximumTrackImage?: ImageSource;
-
- /**
- * Permits tapping on the slider track to set the thumb position.
- * Defaults to false on iOS. No effect on Android or Windows.
- */
tapToSeek?: boolean;
}>;
-type Props = ViewProps &
+type WindowsProps = Readonly<{
+ vertical?: boolean;
+}>;
+
+export type SliderProps = ViewProps &
IOSProps &
WindowsProps &
Readonly<{
- /**
- * Used to style and layout the `Slider`. See `StyleSheet.js` and
- * `DeprecatedViewStylePropTypes.js` for more info.
- */
style?: StyleProp;
-
- /**
- * Write-only property representing the value of the slider.
- * Can be used to programmatically control the position of the thumb.
- * Entered once at the beginning still acts as an initial value.
- * The value should be between minimumValue and maximumValue,
- * which default to 0 and 1 respectively.
- * Default value is 0.
- *
- * This is not a controlled component, you don't need to update the
- * value during dragging.
- */
value?: number;
-
- /**
- * Step value of the slider. The value should be
- * between 0 and (maximumValue - minimumValue).
- * Default value is 0.
- */
step?: number;
-
- /**
- * Initial minimum value of the slider. Default value is 0.
- */
minimumValue?: number;
-
- /**
- * Initial maximum value of the slider. Default value is 1.
- */
maximumValue?: number;
-
- /**
- * The lower limit value of the slider. The user won't be able to slide below this limit.
- */
+ minValue?: number;
+ maxValue?: number;
lowerLimit?: number;
-
- /**
- * The upper limit value of the slider. The user won't be able to slide above this limit.
- */
upperLimit?: number;
-
- /**
- * The color used for the track to the left of the button.
- * Overrides the default blue gradient image on iOS.
- */
minimumTrackTintColor?: ColorValue;
-
- /**
- * The color used for the track to the right of the button.
- * Overrides the default blue gradient image on iOS.
- */
maximumTrackTintColor?: ColorValue;
- /**
- * The color used to tint the default thumb images on iOS, or the
- * color of the foreground switch grip on Android.
- */
thumbTintColor?: ColorValue;
-
- /**
- * If true the user won't be able to move the slider.
- * Default value is false.
- */
disabled?: boolean;
-
- /**
- * Callback continuously called while the user is dragging the slider.
- */
- onValueChange?: (_value: number) => void;
-
- /**
- * Callback that is called when the user touches the slider,
- * regardless if the value has changed. The current value is passed
- * as an argument to the callback handler.
- */
- onSlidingStart?: (_value: number) => void;
-
- /**
- * Callback that is called when the user releases the slider,
- * regardless if the value has changed. The current value is passed
- * as an argument to the callback handler.
- */
- onSlidingComplete?: (_value: number) => void;
-
- /**
- * Used to locate this view in UI automation tests.
- */
- testID?: string;
-
- /**
- * Sets an image for the thumb. Only static images are supported.
- */
+ onValueChange?: (value: number) => void;
+ onSlidingStart?: (value: number) => void;
+ onSlidingComplete?: (value: number) => void;
thumbImage?: ImageSource;
-
- /**
- * Sets the size (width and height) of the thumb.
- * If `thumbImage` is provided, it will be scaled to this size.
- */
thumbSize?: number;
-
- /**
- * If true the slider will be inverted.
- * Default value is false.
- */
inverted?: boolean;
-
- /**
- * Component to be rendered for each step indicator.
- */
- StepMarker?: FC;
-
- /**
- *
- */
+ StepMarker?: React.FC;
renderStepNumber?: boolean;
-
- /**
- * A string of one or more words to be announced by the screen reader.
- * Otherwise, it will announce the value as a percentage.
- * Requires passing a value to `accessibilityIncrements` to work correctly.
- * Should be a plural word, as singular units will be handled.
- */
accessibilityUnits?: string;
-
- /**
- * An array of values that represent the different increments displayed
- * by the slider. All the values passed into this prop must be strings.
- * Requires passing a value to `accessibilityUnits` to work correctly.
- * The number of elements must be the same as `maximumValue`.
- */
accessibilityIncrements?: Array;
}>;
-const SliderComponent = (
- {
- onValueChange,
- onSlidingStart,
- onSlidingComplete,
- onAccessibilityAction,
- value = constants.SLIDER_DEFAULT_INITIAL_VALUE,
- minimumValue = 0,
- maximumValue = 1,
- step = 0,
- inverted = false,
- tapToSeek = false,
- lowerLimit = Platform.select({
- web: minimumValue,
- default: constants.LIMIT_MIN_VALUE,
- }),
- upperLimit = Platform.select({
- web: maximumValue,
- default: constants.LIMIT_MAX_VALUE,
- }),
- ...props
- }: Props,
- forwardedRef?: Ref,
-) => {
- const [currentValue, setCurrentValue] = useState(
- value ?? minimumValue ?? constants.SLIDER_DEFAULT_INITIAL_VALUE,
- );
- const [width, setWidth] = useState(0);
-
- const stepResolution = step ? step : constants.DEFAULT_STEP_RESOLUTION;
+const clamp = (nextValue: number, minimumValue: number, maximumValue: number) =>
+ Math.min(Math.max(nextValue, minimumValue), maximumValue);
- const defaultStep = (maximumValue - minimumValue) / stepResolution;
- const stepLength = step || defaultStep;
+const resolveImageSource = (source?: ImageSource) =>
+ source ? Image.resolveAssetSource(source as ImageSourcePropType) : undefined;
- const options = Array.from(
+export const Slider = React.forwardRef<
+ React.ElementRef,
+ SliderProps
+>(
+ (
{
- length: (step ? defaultStep : stepResolution) + 1,
+ minValue,
+ maxValue,
+ minimumValue = minValue ?? 0,
+ maximumValue = maxValue ?? 1,
+ value = constants.SLIDER_DEFAULT_INITIAL_VALUE,
+ lowerLimit = Platform.select({
+ web: minimumValue,
+ default: constants.LIMIT_MIN_VALUE,
+ }),
+ upperLimit = Platform.select({
+ web: maximumValue,
+ default: constants.LIMIT_MAX_VALUE,
+ }),
+ step = 0,
+ inverted = false,
+ tapToSeek = false,
+ onValueChange,
+ onSlidingStart,
+ onSlidingComplete,
+ onAccessibilityAction,
+ style,
+ StepMarker,
+ renderStepNumber,
+ accessibilityState,
+ trackImage,
+ minimumTrackImage,
+ maximumTrackImage,
+ thumbImage,
+ thumbSize,
+ thumbTintColor,
+ ...props
},
- (_, index) => minimumValue + index * stepLength,
- );
-
- const defaultStyle =
- Platform.OS === 'ios' ? styles.defaultSlideriOS : styles.defaultSlider;
- const sliderStyle = {zIndex: 1, width: width};
- const style = [defaultStyle, props.style];
-
- const onValueChangeEvent = (event: Event) => {
- onValueChange && onValueChange(event.nativeEvent.value);
- setCurrentValue(event.nativeEvent.value);
- };
-
- const _disabled =
- typeof props.disabled === 'boolean'
- ? props.disabled
- : props.accessibilityState?.disabled === true;
-
- const _accessibilityState =
- typeof props.disabled === 'boolean'
- ? {...props.accessibilityState, disabled: props.disabled}
- : props.accessibilityState;
-
- const onSlidingStartEvent = onSlidingStart
- ? (event: Event) => {
- onSlidingStart(event.nativeEvent.value);
- }
- : null;
- const onSlidingCompleteEvent = onSlidingComplete
- ? (event: Event) => {
- onSlidingComplete(event.nativeEvent.value);
+ forwardedRef,
+ ) => {
+ const [currentValue, setCurrentValue] = useState(
+ clamp(value ?? minimumValue, minimumValue, maximumValue),
+ );
+ const [width, setWidth] = useState(0);
+
+ useEffect(() => {
+ if (lowerLimit >= upperLimit) {
+ console.warn(
+ 'Invalid configuration: lower limit is supposed to be smaller than upper limit',
+ );
}
- : null;
- const onAccessibilityActionEvent = onAccessibilityAction
- ? (event: AccessibilityActionEvent) => {
- onAccessibilityAction(event);
+ }, [lowerLimit, upperLimit]);
+
+ useEffect(() => {
+ setCurrentValue(clamp(value ?? minimumValue, minimumValue, maximumValue));
+ }, [maximumValue, minimumValue, value]);
+
+ const stepResolution = step || constants.DEFAULT_STEP_RESOLUTION;
+ const defaultStep = (maximumValue - minimumValue) / stepResolution;
+ const stepLength = step || defaultStep;
+ const options = useMemo(
+ () =>
+ Array.from(
+ {
+ length:
+ Math.max(Math.round(step ? defaultStep : stepResolution), 0) + 1,
+ },
+ (_, index) => minimumValue + index * stepLength,
+ ),
+ [defaultStep, minimumValue, step, stepLength, stepResolution],
+ );
+
+ const nativeStep = useMemo(() => {
+ if (!step) {
+ return 0;
}
- : null;
-
- const passedValue = Number.isNaN(value) || !value ? undefined : value;
- useEffect(() => {
- if (lowerLimit >= upperLimit) {
- console.warn(
- 'Invalid configuration: lower limit is supposed to be smaller than upper limit',
- );
- }
- }, [lowerLimit, upperLimit]);
+ if (Platform.OS === 'android') {
+ return Math.max(
+ Math.round(Math.abs((maximumValue - minimumValue) / step)) - 1,
+ 0,
+ );
+ }
- return (
- {
- setWidth(event.nativeEvent.layout.width);
- }}
- style={[style, {justifyContent: 'center'}]}>
- {props.StepMarker || !!props.renderStepNumber ? (
-
- ) : null}
- ) => {
+ const nextValue = event.nativeEvent.value;
+ setCurrentValue(nextValue);
+ onValueChange?.(nextValue);
+ },
+ [onValueChange],
+ );
+
+ const handleSlidingStart = useCallback(
+ (event: NativeSyntheticEvent) => {
+ onSlidingStart?.(event.nativeEvent.value);
+ },
+ [onSlidingStart],
+ );
+
+ const handleSlidingComplete = useCallback(
+ (event: NativeSyntheticEvent) => {
+ onSlidingComplete?.(event.nativeEvent.value);
+ },
+ [onSlidingComplete],
+ );
+
+ const handleAccessibilityAction = onAccessibilityAction
+ ? (event: AccessibilityActionEvent) => {
+ onAccessibilityAction(event);
}
- ref={forwardedRef}
+ : undefined;
+
+ const disabled =
+ typeof props.disabled === 'boolean'
+ ? props.disabled
+ : accessibilityState?.disabled === true;
+
+ const nextAccessibilityState =
+ typeof props.disabled === 'boolean'
+ ? {...accessibilityState, disabled: props.disabled}
+ : accessibilityState;
+
+ const defaultStyle =
+ Platform.OS === 'ios'
+ ? sliderStyles.defaultSlideriOS
+ : sliderStyles.defaultSlider;
+
+ const shouldRenderStepOverlay = !!StepMarker || !!renderStepNumber;
+ const shouldRenderCustomStepMarker = !!StepMarker;
+
+ const resolvedTrackImage =
+ Platform.OS === 'web' ? trackImage : resolveImageSource(trackImage);
+ const resolvedMinimumTrackImage =
+ Platform.OS === 'web'
+ ? minimumTrackImage
+ : resolveImageSource(minimumTrackImage);
+ const resolvedMaximumTrackImage =
+ Platform.OS === 'web'
+ ? maximumTrackImage
+ : resolveImageSource(maximumTrackImage);
+ const resolvedThumbImage =
+ Platform.OS === 'web' || shouldRenderStepOverlay
+ ? thumbImage
+ : resolveImageSource(thumbImage);
+
+ return (
+ {
+ setWidth(event.nativeEvent.layout.width);
+ }}
style={[
- sliderStyle,
defaultStyle,
- {alignContent: 'center', alignItems: 'center'},
- ]}
- onChange={onValueChangeEvent}
- onRNCSliderSlidingStart={onSlidingStartEvent}
- onRNCSliderSlidingComplete={onSlidingCompleteEvent}
- onRNCSliderValueChange={onValueChangeEvent}
- disabled={_disabled}
- onStartShouldSetResponder={() => true}
- onResponderTerminationRequest={() => false}
- onRNCSliderAccessibilityAction={onAccessibilityActionEvent}
- thumbTintColor={
- props.thumbImage && !!props.StepMarker
- ? 'transparent'
- : props.thumbTintColor
- }
- />
-
- );
-};
+ style,
+ {justifyContent: 'center', overflow: 'visible'},
+ ]}>
+ {shouldRenderStepOverlay ? (
+
+ ) : null}
+ )}
+ accessibilityState={nextAccessibilityState}
+ disabled={disabled}
+ inverted={inverted}
+ tapToSeek={tapToSeek}
+ minValue={minimumValue}
+ maxValue={maximumValue}
+ lowerLimit={lowerLimit}
+ upperLimit={upperLimit}
+ value={Number.isNaN(value) ? undefined : value}
+ step={nativeStep}
+ trackImage={resolvedTrackImage}
+ minimumTrackImage={resolvedMinimumTrackImage}
+ maximumTrackImage={resolvedMaximumTrackImage}
+ thumbImage={
+ shouldRenderCustomStepMarker ? undefined : resolvedThumbImage
+ }
+ thumbSize={thumbSize}
+ thumbTintColor={
+ shouldRenderCustomStepMarker ||
+ (thumbImage && shouldRenderStepOverlay)
+ ? 'transparent'
+ : thumbTintColor
+ }
+ ref={forwardedRef}
+ onValueChange={handleValueChange}
+ onSlidingStart={onSlidingStart ? handleSlidingStart : undefined}
+ onSlidingComplete={
+ onSlidingComplete ? handleSlidingComplete : undefined
+ }
+ onAccessibilityAction={handleAccessibilityAction}
+ onStartShouldSetResponder={() => true}
+ onResponderTerminationRequest={() => false}
+ style={[
+ styles.base,
+ defaultStyle,
+ {
+ alignContent: 'center',
+ alignItems: 'center',
+ overflow: 'visible',
+ width,
+ },
+ ]}
+ />
+
+ );
+ },
+);
+
+export type {MarkerProps};
+
+Slider.displayName = 'Slider';
-const SliderWithRef = React.forwardRef(SliderComponent);
+export default Slider;
-export default SliderWithRef;
+const styles = StyleSheet.create({
+ base: {
+ minHeight: 40,
+ },
+});
diff --git a/package/src/RNCSliderNativeComponent.ts b/package/src/SliderNativeComponent.ts
similarity index 52%
rename from package/src/RNCSliderNativeComponent.ts
rename to package/src/SliderNativeComponent.ts
index 62f97abd..dcc67a65 100644
--- a/package/src/RNCSliderNativeComponent.ts
+++ b/package/src/SliderNativeComponent.ts
@@ -1,19 +1,23 @@
-import type {ColorValue, HostComponent, ViewProps} from 'react-native';
-import {ImageSource, codegenNativeComponent} from 'react-native';
+import {
+ type ColorValue,
+ codegenNativeComponent,
+ type HostComponent,
+ type ImageSource,
+ type ViewProps,
+} from 'react-native';
import type {
- Float,
- WithDefault,
DirectEventHandler,
- BubblingEventHandler,
Double,
+ Float,
+ WithDefault,
} from 'react-native/Libraries/Types/CodegenTypes';
-type Event = Readonly<{
- value: Float;
+export type SliderChangeEvent = Readonly<{
+ value: Double;
fromUser?: boolean;
}>;
-export interface NativeProps extends ViewProps {
+export interface NativeSliderProps extends ViewProps {
accessibilityUnits?: string;
accessibilityIncrements?: ReadonlyArray;
disabled?: WithDefault;
@@ -22,25 +26,23 @@ export interface NativeProps extends ViewProps {
tapToSeek?: WithDefault;
maximumTrackImage?: ImageSource;
maximumTrackTintColor?: ColorValue;
- maximumValue?: Double;
minimumTrackImage?: ImageSource;
minimumTrackTintColor?: ColorValue;
- minimumValue?: Double;
- onChange?: BubblingEventHandler;
- onRNCSliderSlidingStart?: DirectEventHandler;
- onRNCSliderSlidingComplete?: DirectEventHandler;
- onRNCSliderValueChange?: BubblingEventHandler;
- step?: Double;
- testID?: string;
thumbImage?: ImageSource;
thumbTintColor?: ColorValue;
thumbSize?: Float;
trackImage?: ImageSource;
+ step?: Double;
+ minValue?: Double;
+ maxValue?: Double;
value?: Float;
lowerLimit?: Float;
upperLimit?: Float;
+ onValueChange?: DirectEventHandler | null;
+ onSlidingStart?: DirectEventHandler | null;
+ onSlidingComplete?: DirectEventHandler | null;
}
-export default codegenNativeComponent('RNCSlider', {
- interfaceOnly: true,
-}) as HostComponent;
+export default codegenNativeComponent(
+ 'SliderView',
+) as HostComponent;
diff --git a/package/src/SliderNativeComponent.web.tsx b/package/src/SliderNativeComponent.web.tsx
new file mode 100644
index 00000000..ac553bc5
--- /dev/null
+++ b/package/src/SliderNativeComponent.web.tsx
@@ -0,0 +1,273 @@
+import React, {
+ useCallback,
+ useEffect,
+ useState,
+ type ForwardedRef,
+} from 'react';
+import {
+ Image,
+ View,
+ type ColorValue,
+ type GestureResponderEvent,
+ type HostComponent,
+ type ImageSourcePropType,
+ type LayoutChangeEvent,
+} from 'react-native';
+
+import type {NativeSliderProps} from './SliderNativeComponent';
+
+const TRACK_HEIGHT = 4;
+const THUMB_SIZE = 20;
+
+const clamp = (value: number, minValue: number, maxValue: number) =>
+ Math.min(Math.max(value, minValue), maxValue);
+
+const snapToStep = (value: number, minValue: number, step?: number) => {
+ if (!step) {
+ return value;
+ }
+
+ return minValue + Math.round((value - minValue) / step) * step;
+};
+
+const getImageUri = (source: unknown): string | undefined => {
+ if (!source) {
+ return undefined;
+ }
+
+ if (typeof source === 'string') {
+ return source;
+ }
+
+ if (Array.isArray(source)) {
+ return getImageUri(source[0]);
+ }
+
+ if (typeof source === 'object') {
+ const imageSource = source as {default?: unknown; uri?: unknown};
+
+ if (typeof imageSource.uri === 'string') {
+ return imageSource.uri;
+ }
+
+ return getImageUri(imageSource.default);
+ }
+
+ return undefined;
+};
+
+const getTrackImageStyle = (source: unknown, width: number) => {
+ const uri = getImageUri(source);
+
+ if (!uri) {
+ return undefined;
+ }
+
+ return {
+ backgroundImage: `url(${JSON.stringify(uri)})`,
+ backgroundPosition: 'left center',
+ backgroundRepeat: 'no-repeat',
+ backgroundSize: `${Math.max(width, 1)}px 100%`,
+ } as never;
+};
+
+const SliderNativeComponent = React.forwardRef(
+ (
+ {
+ minValue = 0,
+ maxValue = 1,
+ value: valueProp,
+ step,
+ onValueChange,
+ onSlidingStart,
+ onSlidingComplete,
+ onLayout,
+ style,
+ disabled,
+ inverted,
+ lowerLimit = minValue,
+ upperLimit = maxValue,
+ minimumTrackTintColor = '#007aff',
+ maximumTrackTintColor = '#b3b3b3',
+ thumbTintColor = '#ffffff',
+ accessibilityIncrements: _accessibilityIncrements,
+ accessibilityUnits: _accessibilityUnits,
+ maximumTrackImage,
+ minimumTrackImage,
+ tapToSeek: _tapToSeek,
+ thumbImage,
+ thumbSize: thumbSizeProp,
+ trackImage,
+ vertical: _vertical,
+ ...props
+ }: NativeSliderProps,
+ ref: ForwardedRef,
+ ) => {
+ const [width, setWidth] = useState(0);
+ const [value, setValue] = useState(valueProp ?? minValue);
+ const thumbSize = thumbSizeProp ?? (thumbImage ? 48 : THUMB_SIZE);
+
+ useEffect(() => {
+ setValue(valueProp ?? minValue);
+ }, [minValue, valueProp]);
+
+ const updateValue = useCallback(
+ (event: GestureResponderEvent) => {
+ if (disabled) {
+ return;
+ }
+
+ const nextPercent = width > 0 ? event.nativeEvent.locationX / width : 0;
+ const percent = inverted ? 1 - nextPercent : nextPercent;
+ const nextValue = clamp(
+ snapToStep(
+ minValue + percent * (maxValue - minValue),
+ minValue,
+ step,
+ ),
+ lowerLimit,
+ upperLimit,
+ );
+
+ setValue(nextValue);
+ onValueChange?.({nativeEvent: {value: nextValue}} as never);
+ },
+ [
+ disabled,
+ inverted,
+ lowerLimit,
+ maxValue,
+ minValue,
+ onValueChange,
+ step,
+ upperLimit,
+ width,
+ ],
+ );
+
+ const startSliding = useCallback(
+ (event: GestureResponderEvent) => {
+ if (disabled) {
+ return;
+ }
+
+ onSlidingStart?.({nativeEvent: {value}} as never);
+ updateValue(event);
+ },
+ [disabled, onSlidingStart, updateValue, value],
+ );
+
+ const completeSliding = useCallback(() => {
+ if (disabled) {
+ return;
+ }
+
+ onSlidingComplete?.({nativeEvent: {value}} as never);
+ }, [disabled, onSlidingComplete, value]);
+
+ const handleLayout = useCallback(
+ (event: LayoutChangeEvent) => {
+ setWidth(event.nativeEvent.layout.width);
+ onLayout?.(event);
+ },
+ [onLayout],
+ );
+
+ const percent =
+ maxValue === minValue
+ ? 0
+ : ((value - minValue) / (maxValue - minValue)) * 100;
+ const renderedPercent = inverted ? 100 - percent : percent;
+ const hasTrackImage = !!getImageUri(trackImage);
+ const maximumTrackImageStyle = getTrackImageStyle(
+ maximumTrackImage ?? trackImage,
+ width,
+ );
+ const minimumTrackImageStyle = getTrackImageStyle(minimumTrackImage, width);
+ const trackHeight =
+ maximumTrackImageStyle || minimumTrackImageStyle || hasTrackImage
+ ? 20
+ : TRACK_HEIGHT;
+
+ return (
+ true}
+ onMoveShouldSetResponder={() => true}
+ onResponderGrant={startSliding}
+ onResponderMove={updateValue}
+ onResponderRelease={completeSliding}
+ onResponderTerminate={completeSliding}>
+
+
+
+ {thumbImage ? (
+
+ ) : (
+
+ )}
+
+ );
+ },
+);
+
+export default SliderNativeComponent as unknown as HostComponent;
diff --git a/package/src/components/StepNumber.tsx b/package/src/components/StepNumber.tsx
index 09f38c03..d7e8e5f0 100644
--- a/package/src/components/StepNumber.tsx
+++ b/package/src/components/StepNumber.tsx
@@ -1,5 +1,6 @@
import React from 'react';
-import {StyleProp, Text, TextStyle, View} from 'react-native';
+import {type StyleProp, Text, type TextStyle, View} from 'react-native';
+
import {styles} from '../utils/styles';
export const StepNumber = ({
diff --git a/package/src/components/StepsIndicator.tsx b/package/src/components/StepsIndicator.tsx
index 0ac98316..11a61893 100644
--- a/package/src/components/StepsIndicator.tsx
+++ b/package/src/components/StepsIndicator.tsx
@@ -1,11 +1,11 @@
-import React, {FC, Fragment, useCallback, useMemo} from 'react';
+import React, {type FC, Fragment, useCallback, useMemo} from 'react';
import {Platform, View} from 'react-native';
-import {StepNumber} from './StepNumber';
-import {MarkerProps, SliderTrackMark} from './TrackMark';
-//@ts-ignore
import type {ImageSource} from 'react-native/Libraries/Image/ImageSource';
-import {styles} from '../utils/styles';
+
+import {StepNumber} from './StepNumber';
+import {type MarkerProps, SliderTrackMark} from './TrackMark';
import {constants} from '../utils/constants';
+import {styles} from '../utils/styles';
export const StepsIndicator = ({
options,
@@ -15,6 +15,7 @@ export const StepsIndicator = ({
renderStepNumber,
thumbImage,
isLTR,
+ thumbSize,
}: {
options: number[];
sliderWidth: number;
@@ -23,6 +24,7 @@ export const StepsIndicator = ({
renderStepNumber?: boolean;
thumbImage?: ImageSource;
isLTR?: boolean;
+ thumbSize?: number;
}) => {
const stepNumberFontStyle = useMemo(() => {
return {
@@ -35,12 +37,24 @@ export const StepsIndicator = ({
const platformDependentStyles = useMemo(() => {
const isWeb = Platform.OS === 'web';
+ const isIOS = Platform.OS === 'ios';
+ const trackInset = isIOS
+ ? (thumbSize || constants.IOS_DEFAULT_THUMB_SIZE) / 2
+ : sliderWidth * constants.MARGIN_HORIZONTAL_PADDING;
+
return {
stepIndicatorContainerStyle: isWeb
? styles.stepsIndicator
+ : isIOS
+ ? {
+ ...styles.stepsIndicator,
+ left: trackInset,
+ position: 'absolute' as const,
+ right: trackInset,
+ }
: {
...styles.stepsIndicator,
- marginHorizontal: sliderWidth * constants.MARGIN_HORIZONTAL_PADDING,
+ marginHorizontal: trackInset,
},
stepIndicatorElementStyle: isWeb
? {
@@ -50,9 +64,12 @@ export const StepsIndicator = ({
}
: styles.stepIndicatorElement,
};
- }, [sliderWidth]);
+ }, [sliderWidth, thumbSize]);
- const values = isLTR ? options.reverse() : options;
+ const values = useMemo(
+ () => (isLTR ? [...options].reverse() : options),
+ [isLTR, options],
+ );
const renderStepIndicator = useCallback(
(i: number, index: number) => {
@@ -96,9 +113,11 @@ export const StepsIndicator = ({
return (
+ style={[
+ platformDependentStyles.stepIndicatorContainerStyle,
+ {pointerEvents: 'none'},
+ ]}>
{values.map((i, index) => renderStepIndicator(i, index))}
);
diff --git a/package/src/components/TrackMark.tsx b/package/src/components/TrackMark.tsx
index 21a096e2..3ee3af1c 100644
--- a/package/src/components/TrackMark.tsx
+++ b/package/src/components/TrackMark.tsx
@@ -1,5 +1,7 @@
-import React, {FC} from 'react';
-import {Image, ImageSource, ImageSourcePropType, View} from 'react-native';
+import React, {type FC} from 'react';
+import {Image, type ImageSourcePropType, View} from 'react-native';
+import type {ImageSource} from 'react-native/Libraries/Image/ImageSource';
+
import {styles} from '../utils/styles';
export type MarkerProps = {
diff --git a/package/src/index.ts b/package/src/index.ts
index ebd6e915..c255d266 100644
--- a/package/src/index.ts
+++ b/package/src/index.ts
@@ -1,3 +1,4 @@
-const RNCSlider = require('./RNCSliderNativeComponent').default;
+import Slider from './Slider';
-export default RNCSlider;
+export type {MarkerProps, SliderProps} from './Slider';
+export default Slider;
diff --git a/package/src/utils/constants.ts b/package/src/utils/constants.ts
index 72b26fbf..a1b75cdb 100644
--- a/package/src/utils/constants.ts
+++ b/package/src/utils/constants.ts
@@ -2,8 +2,8 @@ import {Platform} from 'react-native';
export const constants = {
SLIDER_DEFAULT_INITIAL_VALUE: 0,
+ IOS_DEFAULT_THUMB_SIZE: 28,
MARGIN_HORIZONTAL_PADDING: 0.05,
- // Default thumb size for web platform (used in step indicator positioning)
THUMB_SIZE: 20,
STEP_NUMBER_TEXT_FONT_SMALL: 8,
STEP_NUMBER_TEXT_FONT_BIG: 12,
diff --git a/package/typings/index.d.ts b/package/typings/index.d.ts
index 6903ca7a..f6166748 100644
--- a/package/typings/index.d.ts
+++ b/package/typings/index.d.ts
@@ -1,7 +1,7 @@
-import * as React from 'react';
-import { FC } from 'react';
-import * as ReactNative from 'react-native';
-import { ImageURISource } from 'react-native';
+import * as React from "react";
+import {type FC} from "react";
+import * as ReactNative from "react-native";
+import {type ImageURISource} from "react-native";
type Constructor = new (...args: any[]) => T;
@@ -37,40 +37,16 @@ export type MarkerProps = {
};
export interface SliderPropsIOS extends ReactNative.ViewProps {
- /**
- * Assigns a maximum track image. Only static images are supported.
- * The leftmost pixel of the image will be stretched to fill the track.
- */
maximumTrackImage?: ReactNative.ImageURISource;
-
- /**
- * Assigns a minimum track image. Only static images are supported.
- * The rightmost pixel of the image will be stretched to fill the track.
- */
minimumTrackImage?: ReactNative.ImageURISource;
-
- /**
- * Permits tapping on the slider track to set the thumb position.
- * Defaults to false on iOS. No effect on Android or Windows.
- */
tapToSeek?: boolean;
-
- /**
- * Sets an image for the thumb. Only static images are supported.
- */
thumbImage?: ReactNative.ImageURISource;
-
- /**
- * Assigns a single image for the track. Only static images
- * are supported. The center pixel of the image will be stretched
- * to fill the track.
- */
trackImage?: ReactNative.ImageURISource;
}
export interface SliderPropsWindows extends ReactNative.ViewProps {
/**
- * Controls the orientation of the slider, default value is 'false' (horizontal).
+ * Controls the orientation of the slider, default value is false.
*/
vertical?: boolean;
}
@@ -79,128 +55,28 @@ export interface SliderProps
extends SliderPropsIOS,
SliderPropsAndroid,
SliderPropsWindows {
- /**
- * If true the user won't be able to move the slider.
- * Default value is false.
- */
disabled?: boolean;
-
- /**
- * The color used for the track to the right of the button.
- * Overrides the default blue gradient image.
- */
maximumTrackTintColor?: string;
-
- /**
- * Initial maximum value of the slider. Default value is 1.
- */
maximumValue?: number;
-
- /**
- * The lower limit value of the slider. The user won't be able to slide below this limit.
- */
+ maxValue?: number;
lowerLimit?: number;
-
- /**
- * The upper limit value of the slider. The user won't be able to slide above this limit.
- */
upperLimit?: number;
-
- /**
- * The color used for the track to the left of the button.
- * Overrides the default blue gradient image.
- */
minimumTrackTintColor?: string;
-
- /**
- * Initial minimum value of the slider. Default value is 0.
- */
minimumValue?: number;
-
- /**
- * Callback that is called when the user picks up the slider.
- * The initial value is passed as an argument to the callback handler.
- */
+ minValue?: number;
onSlidingStart?: (value: number) => void;
-
- /**
- * Callback called when the user finishes changing the value (e.g. when the slider is released).
- */
onSlidingComplete?: (value: number) => void;
-
- /**
- * Callback continuously called while the user is dragging the slider.
- */
onValueChange?: (value: number) => void;
-
- /**
- * Step value of the slider. The value should be between 0 and (maximumValue - minimumValue). Default value is 0.
- */
step?: number;
-
- /**
- * Used to style and layout the Slider. See StyleSheet.js and ViewStylePropTypes.js for more info.
- */
style?: ReactNative.StyleProp;
-
- /**
- * Used to locate this view in UI automation tests.
- */
testID?: string;
-
- /**
- * Write-only property representing the value of the slider.
- * Can be used to programmatically control the position of the thumb.
- * Entered once at the beginning still acts as an initial value.
- * The value should be between minimumValue and maximumValue,
- * which default to 0 and 1 respectively.
- * Default value is 0.
- *
- * This is not a controlled component, you don't need to update the
- * value during dragging.
- */
value?: number;
-
- /**
- * Reverses the direction of the slider.
- */
inverted?: boolean;
-
- /**
- * Sets the size (width and height) of the thumb.
- * If `thumbImage` is provided, it will be scaled to this size.
- */
thumbSize?: number;
-
- /**
- * Component to be rendered for each step indicator.
- */
StepMarker?: FC;
-
- /**
- *
- */
renderStepNumber?: boolean;
-
- /**
- * A string of one or more words to be announced by the screen reader.
- * Otherwise, it will announce the value as a percentage.
- * Requires passing a value to `accessibilityIncrements` to work correctly.
- * Should be a plural word, as singular units will be handled.
- */
accessibilityUnits?: string;
-
- /**
- * An array of values that represent the different increments displayed
- * by the slider. All the values passed into this prop must be strings.
- * Requires passing a value to `accessibilityUnits` to work correctly.
- * The number of elements must be the same as `maximumValue`.
- */
accessibilityIncrements?: Array;
-
- /**
- * Reference object.
- */
ref?: SliderReferenceType;
}
diff --git a/package/windows/SliderWindows/SliderViewManager.cpp b/package/windows/SliderWindows/SliderViewManager.cpp
index 16ea5218..8f248de5 100644
--- a/package/windows/SliderWindows/SliderViewManager.cpp
+++ b/package/windows/SliderWindows/SliderViewManager.cpp
@@ -19,7 +19,7 @@ namespace winrt::SliderWindows::implementation {
// IViewManager
winrt::hstring SliderViewManager::Name() noexcept {
- return L"RNCSlider";
+ return L"Slider";
}
xaml::FrameworkElement SliderViewManager::CreateView() noexcept {
@@ -73,8 +73,8 @@ namespace winrt::SliderWindows::implementation {
ConstantProviderDelegate SliderViewManager::ExportedCustomDirectEventTypeConstants() noexcept {
return [](winrt::IJSValueWriter const& constantWriter) {
WriteCustomDirectEventTypeConstant(constantWriter, "onChange");
- WriteCustomDirectEventTypeConstant(constantWriter, L"topSlidingStart", L"onRNCSliderSlidingStart");
- WriteCustomDirectEventTypeConstant(constantWriter, L"topSlidingComplete", L"onRNCSliderSlidingComplete");
+ WriteCustomDirectEventTypeConstant(constantWriter, L"topSlidingStart", L"onSliderSlidingStart");
+ WriteCustomDirectEventTypeConstant(constantWriter, L"topSlidingComplete", L"onSliderSlidingComplete");
};
}