diff --git a/.changeset/clever-pants-approve.md b/.changeset/clever-pants-approve.md
new file mode 100644
index 00000000..897f0a09
--- /dev/null
+++ b/.changeset/clever-pants-approve.md
@@ -0,0 +1,5 @@
+---
+"react-native-reanimated-carousel": patch
+---
+
+fix: typescript error where MeasuredDimension can be null
diff --git a/.changeset/lazy-tips-wave.md b/.changeset/lazy-tips-wave.md
new file mode 100644
index 00000000..a6612a3c
--- /dev/null
+++ b/.changeset/lazy-tips-wave.md
@@ -0,0 +1,5 @@
+---
+"react-native-reanimated-carousel": patch
+---
+
+Add dot animation.
diff --git a/.changeset/many-ads-fry.md b/.changeset/many-ads-fry.md
new file mode 100644
index 00000000..6f440d70
--- /dev/null
+++ b/.changeset/many-ads-fry.md
@@ -0,0 +1,5 @@
+---
+'react-native-reanimated-carousel': patch
+---
+
+fix: make gesture onStart/onUpdate/onEnd (et al) callbacks run as worklets again
diff --git a/.changeset/nine-moose-whisper.md b/.changeset/nine-moose-whisper.md
new file mode 100644
index 00000000..ead48680
--- /dev/null
+++ b/.changeset/nine-moose-whisper.md
@@ -0,0 +1,5 @@
+---
+"react-native-reanimated-carousel": patch
+---
+
+fix app crash when using "onProgressChange" prop as function
diff --git a/.changeset/pre.json b/.changeset/pre.json
index ecca2da9..12af7ec0 100644
--- a/.changeset/pre.json
+++ b/.changeset/pre.json
@@ -1,8 +1,8 @@
{
"mode": "pre",
- "tag": "alpha",
+ "tag": "canary",
"initialVersions": {
- "react-native-reanimated-carousel": "3.5.1"
+ "react-native-reanimated-carousel": "4.0.0-alpha.12"
},
"changesets": [
"bright-socks-change",
diff --git a/.changeset/spotty-melons-return.md b/.changeset/spotty-melons-return.md
new file mode 100644
index 00000000..2983a92b
--- /dev/null
+++ b/.changeset/spotty-melons-return.md
@@ -0,0 +1,5 @@
+---
+'react-native-reanimated-carousel': patch
+---
+
+fix: rework code to avoid possible flicker when starting pan (panOffset race condition)
diff --git a/.eslintrc.js b/.eslintrc.js
index c3f9206e..1439070c 100644
--- a/.eslintrc.js
+++ b/.eslintrc.js
@@ -2,9 +2,11 @@ module.exports = {
extends: "@dohooo",
rules: {
"@typescript-eslint/no-use-before-define": "off",
+ "@typescript-eslint/member-delimiter-style": "off",
"quotes": "off",
"@typescript-eslint/quotes": "error",
"operator-linebreak": "off",
+ "@typescript-eslint/indent": "off",
},
- plugins: ["jest"],
+ plugins: ["jest", "prettier"],
};
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index d841de23..2916faa6 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -12,7 +12,7 @@ yarn
> While it's possible to use [`npm`](https://github.com/npm/cli), the tooling is built around [`yarn`](https://classic.yarnpkg.com/), so you'll have an easier time if you use `yarn` for development.
-While developing, you can run the [example app](/exampleExpo/) to test your changes. Any changes you make in your library's JavaScript code will be reflected in the example app without a rebuild. If you change any native code, then you'll need to rebuild the example app.
+While developing, you can run the [example app](/example/expo/) to test your changes. Any changes you make in your library's JavaScript code will be reflected in the example app without a rebuild. If you change any native code, then you'll need to rebuild the example app.
To start build:
@@ -23,19 +23,19 @@ yarn dev
To run the example app on Android:
```sh
-yarn android
+cd example/expo && yarn && yarn android
```
To run the example app on iOS:
```sh
-yarn ios
+cd example/expo && yarn && yarn ios
```
To run the example app on Web:
```sh
-yarn web
+cd example/expo && yarn && yarn web
```
Make sure your code passes TypeScript and ESLint. Run the following to verify:
diff --git a/example/app/src/pages/parallax/index.tsx b/example/app/src/pages/parallax/index.tsx
index 40de402a..3c34860e 100644
--- a/example/app/src/pages/parallax/index.tsx
+++ b/example/app/src/pages/parallax/index.tsx
@@ -1,6 +1,6 @@
import * as React from "react";
import { View } from "react-native";
-import { useSharedValue } from "react-native-reanimated";
+import { useSharedValue, interpolate, Extrapolation } from "react-native-reanimated";
import Carousel, {
ICarouselInstance,
Pagination,
@@ -156,6 +156,7 @@ function Index() {
activeDotStyle={{
borderRadius: 100,
overflow: "hidden",
+ backgroundColor: "rgba(0,0,0,0.2)",
}}
containerStyle={[
isVertical
@@ -166,6 +167,10 @@ function Index() {
top: 40,
}
: undefined,
+ {
+ gap: 5,
+ marginBottom: 10,
+ },
]}
horizontal={!isVertical}
renderItem={(item) => (
@@ -179,6 +184,118 @@ function Index() {
onPress={onPressPagination}
/>
+
+ progress={progress}
+ data={colors.map((color) => ({ color }))}
+ size={20}
+ dotStyle={{
+ borderRadius: 16,
+ backgroundColor: "rgba(0,0,0,0.2)",
+ }}
+ activeDotStyle={{
+ borderRadius: 8,
+ width: 40,
+ height: 30,
+ overflow: "hidden",
+ backgroundColor: 'black',
+ }}
+ containerStyle={[
+ isVertical
+ ? {
+ position: "absolute",
+ width: 20,
+ right: 5,
+ top: 40,
+ }
+ : undefined,
+ {
+ gap: 5,
+ marginBottom: 10,
+ alignItems: "center",
+ },
+ ]}
+ horizontal={!isVertical}
+ onPress={onPressPagination}
+ customReanimatedStyle={(progress, index, length) => {
+ let val = Math.abs(progress - index);
+ if (index === 0 && progress > length - 1) {
+ val = Math.abs(progress - length);
+ }
+
+ return {
+ transform: [
+ {
+ translateY: interpolate(
+ val,
+ [0, 1],
+ [10, 0],
+ Extrapolation.CLAMP,
+ ),
+ }
+ ]
+ }
+ }}
+ />
+
+
+ progress={progress}
+ data={colors.map((color) => ({ color }))}
+ size={20}
+ dotStyle={{
+ borderRadius: 16,
+ backgroundColor: "rgba(0,0,0,0.2)",
+ }}
+ activeDotStyle={{
+ borderRadius: 8,
+ width: 40,
+ height: 30,
+ overflow: "hidden",
+ }}
+ containerStyle={[
+ isVertical
+ ? {
+ position: "absolute",
+ width: 20,
+ right: 5,
+ top: 40,
+ }
+ : undefined,
+ {
+ gap: 5,
+ alignItems: "center",
+ },
+ ]}
+ horizontal={!isVertical}
+ onPress={onPressPagination}
+ customReanimatedStyle={(progress, index, length) => {
+ let val = Math.abs(progress - index);
+ if (index === 0 && progress > length - 1) {
+ val = Math.abs(progress - length);
+ }
+
+ return {
+ transform: [
+ {
+ translateY: interpolate(
+ val,
+ [0, 1],
+ [10, 0],
+ Extrapolation.CLAMP,
+ ),
+ }
+ ]
+ }
+ }}
+ renderItem={(item) => (
+
+ )}
+ />
+
setAutoPlay(!autoPlay)}
>{`${ElementsText.AUTOPLAY}:${autoPlay}`}
diff --git a/example/app/src/utils/log.ts b/example/app/src/utils/log.ts
index 4bd70e1e..55778739 100644
--- a/example/app/src/utils/log.ts
+++ b/example/app/src/utils/log.ts
@@ -1,6 +1,6 @@
/**
* In worklet
- * e.g. runOnJS(lop)(...);
+ * e.g. runOnJS(log)(...);
*/
export function log(...msg: any) {
console.log(...msg);
diff --git a/example/expo/app.config.js b/example/expo/app.config.js
index 76b7877d..0071381b 100644
--- a/example/expo/app.config.js
+++ b/example/expo/app.config.js
@@ -19,6 +19,7 @@ export default () => {
],
ios: {
supportsTablet: true,
+ bundleIdentifier: "com.rnrc.exampleExpo",
},
android: {
adaptiveIcon: {
diff --git a/example/expo/package.json b/example/expo/package.json
index e4544940..75c985fc 100644
--- a/example/expo/package.json
+++ b/example/expo/package.json
@@ -56,7 +56,7 @@
"gh-pages": "^3.2.3",
"react-error-overlay": "6.0.9",
"react-native-web": "~0.19.6",
- "typescript": "^5.1.3"
+ "typescript": "^5.5.4"
},
"resolutions": {
"@babel/core": "^7.18.0",
diff --git a/example/expo/yarn.lock b/example/expo/yarn.lock
index 2d944438..9242d111 100644
--- a/example/expo/yarn.lock
+++ b/example/expo/yarn.lock
@@ -11681,7 +11681,7 @@ __metadata:
react-native-safe-area-context: 4.6.3
react-native-screens: ~3.22.0
react-native-web: ~0.19.6
- typescript: ^5.1.3
+ typescript: ^5.5.4
languageName: unknown
linkType: soft
@@ -13512,23 +13512,23 @@ __metadata:
languageName: node
linkType: hard
-"typescript@npm:^5.1.3":
- version: 5.1.6
- resolution: "typescript@npm:5.1.6"
+"typescript@npm:^5.5.4":
+ version: 5.5.4
+ resolution: "typescript@npm:5.5.4"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: b2f2c35096035fe1f5facd1e38922ccb8558996331405eb00a5111cc948b2e733163cc22fab5db46992aba7dd520fff637f2c1df4996ff0e134e77d3249a7350
+ checksum: b309040f3a1cd91c68a5a58af6b9fdd4e849b8c42d837b2c2e73f9a4f96a98c4f1ed398a9aab576ee0a4748f5690cf594e6b99dbe61de7839da748c41e6d6ca8
languageName: node
linkType: hard
-"typescript@patch:typescript@^5.1.3#~builtin":
- version: 5.1.6
- resolution: "typescript@patch:typescript@npm%3A5.1.6#~builtin::version=5.1.6&hash=5da071"
+"typescript@patch:typescript@^5.5.4#~builtin":
+ version: 5.5.4
+ resolution: "typescript@patch:typescript@npm%3A5.5.4#~builtin::version=5.5.4&hash=14eedb"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: f53bfe97f7c8b2b6d23cf572750d4e7d1e0c5fff1c36d859d0ec84556a827b8785077bc27676bf7e71fae538e517c3ecc0f37e7f593be913d884805d931bc8be
+ checksum: fc52962f31a5bcb716d4213bef516885e4f01f30cea797a831205fc9ef12b405a40561c40eae3127ab85ba1548e7df49df2bcdee6b84a94bfbe3a0d7eff16b14
languageName: node
linkType: hard
diff --git a/example/website/package.json b/example/website/package.json
index bc2c8e8f..08daf007 100644
--- a/example/website/package.json
+++ b/example/website/package.json
@@ -2,21 +2,21 @@
"name": "nextra-docs-template",
"version": "0.0.1",
"description": "Nextra docs template",
- "scripts": {
- "dev": "next dev",
- "build": "node scripts/gen-pages.mjs && next build",
- "start": "next start"
- },
+ "author": "Shu Ding ",
+ "license": "MIT",
+ "homepage": "https://github.com/shuding/nextra-docs-template#readme",
"repository": {
"type": "git",
"url": "git+https://github.com/shuding/nextra-docs-template.git"
},
- "author": "Shu Ding ",
- "license": "MIT",
"bugs": {
"url": "https://github.com/shuding/nextra-docs-template/issues"
},
- "homepage": "https://github.com/shuding/nextra-docs-template#readme",
+ "scripts": {
+ "dev": "next dev",
+ "build": "node scripts/gen-pages.mjs && next build",
+ "start": "next start"
+ },
"dependencies": {
"@vercel/analytics": "^1.1.1",
"next": "^13.0.6",
@@ -32,6 +32,6 @@
"postcss": "^8.4.32",
"react-native-web": "~0.19.6",
"tailwindcss": "^3.3.6",
- "typescript": "^4.9.3"
+ "typescript": "^5.5.4"
}
}
diff --git a/example/website/pages/custom-animations.mdx b/example/website/pages/custom-animations.mdx
index 5061b19e..c2a437c5 100644
--- a/example/website/pages/custom-animations.mdx
+++ b/example/website/pages/custom-animations.mdx
@@ -31,7 +31,7 @@ After some effort, we finally implemented custom animation in v2, now we just ne
### Prepare
```
-type TAnimationStyle = (value: number) => Animated.AnimatedStyleProp;
+type TAnimationStyle = (value: number) => ViewStyle;
```
This function will be called in each item and accepts a parameter `value` indicating the position of the current item relative to `window`. The following picture shows the relationship between `value` and position
diff --git a/example/website/pages/props.mdx b/example/website/pages/props.mdx
index ed01f24c..4697a83a 100644
--- a/example/website/pages/props.mdx
+++ b/example/website/pages/props.mdx
@@ -286,7 +286,7 @@ Custom animations. For details, see below\[custom animation\]\(.\/custom-animati
| type | default | required |
| ------ | ------- | -------- |
-| \(value: number\) => Animated.AnimatedStyleProp\ | - | ❌ |
+| \(value: number\) => ViewStyle | - | ❌ |
### `maxScrollDistancePerSwipe`
@@ -409,6 +409,89 @@ Slide direction
## Ref
+By using these methods, remember you need to reference the component using [React useRef()](https://react.dev/reference/react/useRef).
+
+**JavaScript**
+
+```js
+const ref = React.useRef(null)
+```
+
+If you're using **TypeScript**:
+
+You need to import:
+
+```ts
+import type { ICarouselInstance } from "react-native-reanimated-carousel";
+```
+
+and then:
+
+```ts
+const ref = React.useRef(null);
+```
+
+Now, you only need to pass the ref to the Carousel component:
+
+```js
+;
+```
+
+And now you can use these methods throughout your component. Here's an example of implementing a button to go to the next slide:
+
+```tsx
+import React from "react";
+import Carousel from "react-native-reanimated-carousel";
+import type { ICarouselInstance } from "react-native-reanimated-carousel";
+import { Button, Text, View } from "react-native";
+
+// 1. Create a data array with the slides
+const data = [
+ {
+ title: "Slide 1",
+ content: "Slide 1 Content",
+ },
+ {
+ title: "Slide 2",
+ content: "Slide 2 Content",
+ },
+ {
+ title: "Slide 3",
+ content: "Slide 3 Content",
+ },
+];
+
+const Example = () => {
+ const ref = React.useRef(null); // 2. Create a ref for the Carousel component
+
+ return (
+
+ {/* 3. Add the Carousel component with the ref */}
+ (
+
+ {item.title}
+ {item.content}
+
+ )}
+ />
+ {/* 5. Add a button to trigger the next slide */}
+
+ );
+};
+
+export default Example;
+```
+
### `prev`
Scroll to previous item, it takes one optional argument \(count\), which allows you to specify how many items to cross
diff --git a/package.json b/package.json
index 53f43e11..7379ee79 100644
--- a/package.json
+++ b/package.json
@@ -1,127 +1,128 @@
{
- "name": "react-native-reanimated-carousel",
- "version": "4.0.0-alpha.12",
- "description": "Simple carousel component.fully implemented using Reanimated 2.Infinitely scrolling, very smooth.",
- "main": "lib/commonjs/index",
- "module": "lib/module/index",
- "react-native": "src/index.tsx",
- "types": "lib/typescript/index.d.ts",
- "source": "src/index",
- "files": [
- "lib",
- "src"
- ],
- "scripts": {
- "gif": "node scripts/makegif.js ./scripts/gif-works-directory",
- "test": "jest run src/**/*",
- "test:dev": "jest dev src/**/* --watch",
- "typescript": "tsc --noEmit",
- "lint": "eslint 'src/**/*.{js,ts,tsx}'",
- "lint:fix": "eslint 'src/**/*.{js,ts,tsx}' --fix",
- "dev": "watch 'yarn prepare' ./src",
- "prepare": "bob build",
- "clean": "del-cli lib",
- "version": "changeset version"
+ "name": "react-native-reanimated-carousel",
+ "version": "4.0.0-alpha.12",
+ "packageManager": "yarn@4.0.2",
+ "description": "Simple carousel component.fully implemented using Reanimated 2.Infinitely scrolling, very smooth.",
+ "author": "Doho (https://github.com/dohooo)",
+ "license": "MIT",
+ "homepage": "https://github.com/dohooo/react-native-reanimated-carousel#readme",
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/dohooo/react-native-reanimated-carousel.git"
+ },
+ "bugs": {
+ "url": "https://github.com/dohooo/react-native-reanimated-carousel/issues"
+ },
+ "keywords": [
+ "react-native",
+ "ios",
+ "android"
+ ],
+ "main": "lib/commonjs/index",
+ "module": "lib/module/index",
+ "react-native": "src/index.tsx",
+ "types": "lib/typescript/index.d.ts",
+ "source": "src/index",
+ "files": [
+ "lib",
+ "src"
+ ],
+ "scripts": {
+ "gif": "node scripts/makegif.js ./scripts/gif-works-directory",
+ "test": "jest run src/**/*",
+ "test:dev": "jest dev src/**/* --watch",
+ "types": "tsc --noEmit",
+ "lint": "eslint 'src/**/*.{js,ts,tsx}'",
+ "lint:fix": "eslint 'src/**/*.{js,ts,tsx}' --fix",
+ "dev": "watch 'yarn prepare' ./src",
+ "prepare": "bob build",
+ "clean": "del-cli lib",
+ "version": "changeset version"
+ },
+ "publishConfig": {
+ "registry": "https://registry.npmjs.org/"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-native": "*",
+ "react": ">=18.0.0",
+ "react-native": ">=0.70.3",
+ "react-native-gesture-handler": ">=2.9.0",
+ "react-native-reanimated": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
},
- "keywords": [
- "react-native",
- "ios",
- "android"
- ],
- "repository": {
- "type": "git",
- "url": "git+https://github.com/dohooo/react-native-reanimated-carousel.git"
- },
- "author": "Doho (https://github.com/dohooo)",
- "license": "MIT",
- "bugs": {
- "url": "https://github.com/dohooo/react-native-reanimated-carousel/issues"
- },
- "homepage": "https://github.com/dohooo/react-native-reanimated-carousel#readme",
- "publishConfig": {
- "registry": "https://registry.npmjs.org/"
- },
- "devDependencies": {
- "@babel/plugin-proposal-class-properties": "^7.18.6",
- "@babel/plugin-proposal-private-methods": "^7.18.6",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@changesets/changelog-github": "^0.5.0",
- "@changesets/cli": "latest",
- "@commitlint/config-conventional": "^11.0.0",
- "@dohooo/eslint-config": "^0.0.7",
- "@react-native-community/eslint-config": "^2.0.0",
- "@stylistic/eslint-plugin-js": "^1.8.0",
- "@testing-library/jest-native": "^4.0.4",
- "@testing-library/react-hooks": "^8.0.0",
- "@testing-library/react-native": "^7.1.0",
- "@types/jest": "^29.2.5",
- "@types/react": "^18.2.15",
- "@types/react-native": "^0.66.16",
- "@types/react-test-renderer": "^18.0.7",
- "babel-plugin-module-resolver": "^4.1.0",
- "commitlint": "^11.0.0",
- "cz-conventional-changelog": "^3.3.0",
- "del-cli": "^5.0.0",
- "eslint": "^8.57.0",
- "eslint-config-prettier": "^7.0.0",
- "eslint-plugin-jest": "^27.6.0",
- "eslint-plugin-prettier": "^3.1.3",
- "gifify": "^2.4.3",
- "husky": "^4.2.5",
- "jest": "^29.3.1",
- "metro-react-native-babel-preset": "^0.77.0",
- "pod-install": "^0.1.0",
- "prettier": "^2.0.5",
- "react": "18.2.0",
- "react-native": "0.72.3",
- "react-native-builder-bob": "^0.18.1",
- "react-native-gesture-handler": "~2.12.0",
- "react-native-reanimated": "~3.3.0",
- "react-test-renderer": "^18.2.0",
- "sponsorkit": "^0.1.3",
- "typescript": "^4.0.8",
- "watch": "^1.0.2"
- },
- "peerDependencies": {
- "@types/react": "*",
- "@types/react-native": "*",
- "react": ">=18.0.0",
- "react-native": ">=0.70.3",
- "react-native-gesture-handler": ">=2.9.0",
- "react-native-reanimated": ">=3.0.0"
- },
- "peerDependenciesMeta": {
- "@types/react": {
- "optional": true
- },
- "@types/react-native": {
- "optional": true
- }
- },
- "husky": {
- "hooks": {
- "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
- "pre-commit": "yarn test && yarn lint && yarn typescript"
- }
- },
- "commitlint": {
- "extends": [
- "@commitlint/config-conventional"
- ]
- },
- "react-native-builder-bob": {
- "source": "src",
- "output": "lib",
- "targets": [
- "commonjs",
- "module",
- "typescript"
- ]
- },
- "config": {
- "commitizen": {
- "path": "./node_modules/cz-conventional-changelog"
- }
- },
- "packageManager": "yarn@4.0.2"
+ "@types/react-native": {
+ "optional": true
+ }
+ },
+ "devDependencies": {
+ "@babel/plugin-proposal-class-properties": "^7.18.6",
+ "@babel/plugin-proposal-private-methods": "^7.18.6",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@changesets/changelog-github": "^0.5.0",
+ "@changesets/cli": "latest",
+ "@commitlint/config-conventional": "^11.0.0",
+ "@dohooo/eslint-config": "^0.0.7",
+ "@react-native-community/eslint-config": "^2.0.0",
+ "@stylistic/eslint-plugin-js": "^1.8.0",
+ "@testing-library/jest-native": "^4.0.4",
+ "@testing-library/react-hooks": "^8.0.0",
+ "@testing-library/react-native": "^7.1.0",
+ "@types/jest": "^29.2.5",
+ "@types/react": "^18.2.15",
+ "@types/react-native": "^0.66.16",
+ "@types/react-test-renderer": "^18.0.7",
+ "@typescript-eslint/typescript-estree": "^8.4.0",
+ "babel-plugin-module-resolver": "^4.1.0",
+ "commitlint": "^11.0.0",
+ "cz-conventional-changelog": "^3.3.0",
+ "del-cli": "^5.0.0",
+ "eslint": "^8.57.0",
+ "eslint-config-prettier": "^7.0.0",
+ "eslint-plugin-jest": "^27.6.0",
+ "eslint-plugin-prettier": "^3.1.3",
+ "gifify": "^2.4.3",
+ "husky": "^4.2.5",
+ "jest": "^29.3.1",
+ "metro-react-native-babel-preset": "^0.77.0",
+ "pod-install": "^0.1.0",
+ "prettier": "^2.0.5",
+ "react": "18.2.0",
+ "react-native": "0.72.3",
+ "react-native-builder-bob": "^0.18.1",
+ "react-native-gesture-handler": "~2.12.0",
+ "react-native-reanimated": "^3.15.1",
+ "react-test-renderer": "^18.2.0",
+ "sponsorkit": "^0.1.3",
+ "typescript": "^5.5.4",
+ "watch": "^1.0.2"
+ },
+ "husky": {
+ "hooks": {
+ "commit-msg": "commitlint -E HUSKY_GIT_PARAMS",
+ "pre-commit": "yarn test && yarn lint && yarn types"
+ }
+ },
+ "commitlint": {
+ "extends": [
+ "@commitlint/config-conventional"
+ ]
+ },
+ "react-native-builder-bob": {
+ "source": "src",
+ "output": "lib",
+ "targets": [
+ "commonjs",
+ "module",
+ "typescript"
+ ]
+ },
+ "config": {
+ "commitizen": {
+ "path": "./node_modules/cz-conventional-changelog"
+ }
+ }
}
diff --git a/src/components/BaseLayout.tsx b/src/components/BaseLayout.tsx
index b158dc35..3dec98b0 100644
--- a/src/components/BaseLayout.tsx
+++ b/src/components/BaseLayout.tsx
@@ -1,6 +1,6 @@
import React from "react";
import type { ViewStyle } from "react-native";
-import type { AnimatedStyleProp } from "react-native-reanimated";
+import type { SharedValue } from "react-native-reanimated";
import Animated, {
useAnimatedStyle,
useDerivedValue,
@@ -12,19 +12,19 @@ import type { IVisibleRanges } from "../hooks/useVisibleRanges";
import type { ILayoutConfig } from "../layouts/stack";
import { CTX } from "../store";
-export type TAnimationStyle = (value: number) => AnimatedStyleProp;
+export type TAnimationStyle = (value: number) => ViewStyle;
export const BaseLayout: React.FC<{
- index: number
- handlerOffset: Animated.SharedValue
- visibleRanges: IVisibleRanges
- animationStyle: TAnimationStyle
+ index: number;
+ handlerOffset: SharedValue;
+ visibleRanges: IVisibleRanges;
+ animationStyle: TAnimationStyle;
children: (ctx: {
- animationValue: Animated.SharedValue
- }) => React.ReactElement
+ animationValue: Animated.SharedValue;
+ }) => React.ReactElement;
}> = (props) => {
- const { handlerOffset, index, children, visibleRanges, animationStyle }
- = props;
+ const { handlerOffset, index, children, visibleRanges, animationStyle } =
+ props;
const context = React.useContext(CTX);
const {
@@ -66,10 +66,8 @@ export const BaseLayout: React.FC<{
const x = useOffsetX(offsetXConfig, visibleRanges);
const animationValue = useDerivedValue(() => x.value / size, [x, size]);
- const animatedStyle = useAnimatedStyle(
- () => {
- return animationStyle(x.value / size);
- },
+ const animatedStyle = useAnimatedStyle(
+ () => animationStyle(x.value / size),
[animationStyle],
);
diff --git a/src/components/ItemRenderer.tsx b/src/components/ItemRenderer.tsx
index 0227bbb2..4c56ac50 100644
--- a/src/components/ItemRenderer.tsx
+++ b/src/components/ItemRenderer.tsx
@@ -1,8 +1,8 @@
import React from "react";
import type { FC } from "react";
import type { ViewStyle } from "react-native";
-import type Animated from "react-native-reanimated";
-import { useAnimatedReaction, type AnimatedStyleProp, runOnJS } from "react-native-reanimated";
+import type { SharedValue } from "react-native-reanimated";
+import { useAnimatedReaction, runOnJS } from "react-native-reanimated";
import type { TAnimationStyle } from "./BaseLayout";
import { BaseLayout } from "./BaseLayout";
@@ -13,18 +13,18 @@ import type { CarouselRenderItem } from "../types";
import { computedRealIndexWithAutoFillData } from "../utils/computed-with-auto-fill-data";
interface Props {
- data: any[]
- dataLength: number
- rawDataLength: number
- loop: boolean
- size: number
- windowSize?: number
- autoFillData: boolean
- offsetX: Animated.SharedValue
- handlerOffset: Animated.SharedValue
- layoutConfig: TAnimationStyle
- renderItem: CarouselRenderItem
- customAnimation?: ((value: number) => AnimatedStyleProp)
+ data: any[];
+ dataLength: number;
+ rawDataLength: number;
+ loop: boolean;
+ size: number;
+ windowSize?: number;
+ autoFillData: boolean;
+ offsetX: SharedValue;
+ handlerOffset: SharedValue;
+ layoutConfig: TAnimationStyle;
+ renderItem: CarouselRenderItem;
+ customAnimation?: (value: number) => ViewStyle;
}
export const ItemRenderer: FC = (props) => {
@@ -51,7 +51,9 @@ export const ItemRenderer: FC = (props) => {
loop,
});
- const [displayedItems, setDisplayedItems] = React.useState(null!);
+ const [displayedItems, setDisplayedItems] = React.useState(
+ null!,
+ );
useAnimatedReaction(
() => visibleRanges.value,
@@ -59,47 +61,44 @@ export const ItemRenderer: FC = (props) => {
[visibleRanges],
);
- if (!displayedItems)
- return null;
+ if (!displayedItems) return null;
return (
<>
- {
- data.map((item, index) => {
- const realIndex = computedRealIndexWithAutoFillData({
- index,
- dataLength: rawDataLength,
- loop,
- autoFillData,
- });
+ {data.map((item, index) => {
+ const realIndex = computedRealIndexWithAutoFillData({
+ index,
+ dataLength: rawDataLength,
+ loop,
+ autoFillData,
+ });
- const { negativeRange, positiveRange } = displayedItems;
+ const { negativeRange, positiveRange } = displayedItems;
- const shouldRender = (index >= negativeRange[0] && index <= negativeRange[1])
- || (index >= positiveRange[0] && index <= positiveRange[1]);
+ const shouldRender =
+ (index >= negativeRange[0] && index <= negativeRange[1]) ||
+ (index >= positiveRange[0] && index <= positiveRange[1]);
- if (!shouldRender)
- return null;
+ if (!shouldRender) return null;
- return (
-
- {({ animationValue }) =>
- renderItem({
- item,
- index: realIndex,
- animationValue,
- })
- }
-
- );
- })
- }
+ return (
+
+ {({ animationValue }) =>
+ renderItem({
+ item,
+ index: realIndex,
+ animationValue,
+ })
+ }
+
+ );
+ })}
>
);
};
diff --git a/src/components/Pagination/Basic/PaginationItem.tsx b/src/components/Pagination/Basic/PaginationItem.tsx
index 8d986ea3..2d13b12f 100644
--- a/src/components/Pagination/Basic/PaginationItem.tsx
+++ b/src/components/Pagination/Basic/PaginationItem.tsx
@@ -3,7 +3,7 @@ import React from "react";
import type { ViewStyle } from "react-native";
import { View } from "react-native";
import Animated, {
- Extrapolate,
+ Extrapolation,
interpolate,
useAnimatedStyle,
} from "react-native-reanimated";
@@ -71,7 +71,7 @@ PropsWithChildren<{
animValue?.value,
inputRange,
outputRange,
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
),
},
],
diff --git a/src/components/Pagination/Basic/index.tsx b/src/components/Pagination/Basic/index.tsx
index cea77e6d..8df84838 100644
--- a/src/components/Pagination/Basic/index.tsx
+++ b/src/components/Pagination/Basic/index.tsx
@@ -1,6 +1,6 @@
import React from "react";
-import type { StyleProp, ViewStyle, TouchableWithoutFeedback } from "react-native";
-import { View } from "react-native";
+import type { StyleProp, ViewStyle } from "react-native";
+import { View, TouchableWithoutFeedback } from "react-native";
import type { SharedValue } from "react-native-reanimated";
import type { DotStyle } from "./PaginationItem";
diff --git a/src/components/Pagination/Custom/PaginationItem.tsx b/src/components/Pagination/Custom/PaginationItem.tsx
new file mode 100644
index 00000000..5e2a78d5
--- /dev/null
+++ b/src/components/Pagination/Custom/PaginationItem.tsx
@@ -0,0 +1,146 @@
+import type { PropsWithChildren } from "react";
+import React from "react";
+import type { ViewStyle } from "react-native";
+import type { SharedValue } from "react-native-reanimated";
+import Animated, {
+ Extrapolation,
+ interpolate,
+ interpolateColor,
+ useAnimatedStyle,
+ runOnJS,
+ useSharedValue,
+ useDerivedValue,
+} from "react-native-reanimated";
+
+import type { DefaultStyle } from "react-native-reanimated/lib/typescript/hook/commonTypes";
+
+export type DotStyle = Omit<
+ ViewStyle,
+ "width" | "height" | "backgroundColor" | "borderRadius"
+> & {
+ width?: number;
+ height?: number;
+ backgroundColor?: string;
+ borderRadius?: number;
+};
+
+export const PaginationItem: React.FC<
+ PropsWithChildren<{
+ index: number;
+ count: number;
+ size?: number;
+ animValue: SharedValue;
+ horizontal?: boolean;
+ dotStyle?: DotStyle;
+ activeDotStyle?: DotStyle;
+ customReanimatedStyle?: (
+ progress: number,
+ index: number,
+ length: number,
+ ) => DefaultStyle;
+ }>
+> = (props) => {
+ const defaultDotSize = 10;
+ const {
+ animValue,
+ dotStyle,
+ activeDotStyle,
+ index,
+ count,
+ size,
+ horizontal,
+ children,
+ customReanimatedStyle,
+ } = props;
+ const customReanimatedStyleRef = useSharedValue({});
+ const handleCustomAnimation = (progress: number) => {
+ customReanimatedStyleRef.value =
+ customReanimatedStyle?.(progress, index, count) ?? {};
+ };
+
+ useDerivedValue(() => {
+ runOnJS(handleCustomAnimation)(animValue?.value);
+ });
+
+ const animStyle = useAnimatedStyle(() => {
+ const {
+ width = size || defaultDotSize,
+ height = size || defaultDotSize,
+ borderRadius,
+ backgroundColor = "#FFF",
+ ...restDotStyle
+ } = dotStyle ?? {};
+ const {
+ width: activeWidth = width,
+ height: activeHeight = height,
+ borderRadius: activeBorderRadius,
+ backgroundColor: activeBackgroundColor = "#000",
+ ...restActiveDotStyle
+ } = activeDotStyle ?? {};
+ let val = Math.abs(animValue?.value - index);
+ if (index === 0 && animValue?.value > count - 1)
+ val = Math.abs(animValue?.value - count);
+
+ const inputRange = [0, 1, 2];
+ const restStyle = (val === 0 ? restActiveDotStyle : restDotStyle) ?? {};
+
+ return {
+ width: interpolate(
+ val,
+ inputRange,
+ [activeWidth, width, width],
+ Extrapolation.CLAMP,
+ ),
+ height: interpolate(
+ val,
+ inputRange,
+ [activeHeight, height, height],
+ Extrapolation.CLAMP,
+ ),
+ borderRadius: interpolate(
+ val,
+ inputRange,
+ [activeBorderRadius ?? borderRadius ?? 0, borderRadius ?? 0, borderRadius ?? 0],
+ Extrapolation.CLAMP,
+ ),
+ backgroundColor: interpolateColor(val, inputRange, [
+ activeBackgroundColor,
+ backgroundColor,
+ backgroundColor,
+ ]),
+ ...restStyle,
+ ...(customReanimatedStyleRef.value ?? {}),
+ transform: [
+ ...(restStyle?.transform ?? []),
+ ...(customReanimatedStyleRef.value?.transform ?? []),
+ ],
+ };
+ }, [
+ animValue,
+ index,
+ count,
+ horizontal,
+ dotStyle,
+ activeDotStyle,
+ customReanimatedStyle,
+ ]);
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/components/Pagination/Custom/index.tsx b/src/components/Pagination/Custom/index.tsx
new file mode 100644
index 00000000..2afff44a
--- /dev/null
+++ b/src/components/Pagination/Custom/index.tsx
@@ -0,0 +1,97 @@
+import React from "react";
+import type { StyleProp, ViewStyle } from "react-native";
+import { View } from "react-native";
+import { TouchableWithoutFeedback } from "react-native-gesture-handler";
+import type { SharedValue } from "react-native-reanimated";
+
+import type { DefaultStyle } from "react-native-reanimated/lib/typescript/hook/commonTypes";
+
+import type { DotStyle } from "./PaginationItem";
+import { PaginationItem } from "./PaginationItem";
+
+export interface ShapeProps {
+ progress: SharedValue
+ horizontal?: boolean
+ data: Array
+ renderItem?: (item: T, index: number) => React.ReactNode
+ containerStyle?: StyleProp
+ dotStyle?: DotStyle
+ activeDotStyle?: DotStyle
+ size?: number
+ onPress?: (index: number) => void
+ customReanimatedStyle?: (
+ progress: number,
+ index: number,
+ length: number,
+ ) => DefaultStyle
+}
+
+export const Custom = (props: ShapeProps) => {
+ const {
+ activeDotStyle,
+ dotStyle,
+ progress,
+ horizontal = true,
+ data,
+ size,
+ containerStyle,
+ renderItem,
+ onPress,
+ customReanimatedStyle,
+ } = props;
+
+ if (
+ typeof size === "string" ||
+ typeof dotStyle?.width === "string" ||
+ typeof dotStyle?.height === "string" ||
+ typeof activeDotStyle?.width === "string" ||
+ typeof activeDotStyle?.height === "string"
+ )
+ throw new Error("size/width/height must be a number");
+
+ const maxItemWidth = Math.max(size ?? 0, dotStyle?.width ?? 0, activeDotStyle?.width ?? 0);
+ const maxItemHeight = Math.max(size ?? 0, dotStyle?.height ?? 0, activeDotStyle?.height ?? 0);
+
+ return (
+
+ {data.map((item, index) => {
+ return (
+ onPress?.(index)}
+ >
+
+ {renderItem?.(item, index)}
+
+
+ );
+ })}
+
+ );
+};
diff --git a/src/components/Pagination/index.tsx b/src/components/Pagination/index.tsx
index 489a013a..17842a00 100644
--- a/src/components/Pagination/index.tsx
+++ b/src/components/Pagination/index.tsx
@@ -1,5 +1,7 @@
import { Basic } from "./Basic";
+import { Custom } from "./Custom";
export const Pagination = {
Basic,
+ Custom,
};
diff --git a/src/components/ScrollViewGesture.tsx b/src/components/ScrollViewGesture.tsx
index 80a3fe0c..597b8e09 100644
--- a/src/components/ScrollViewGesture.tsx
+++ b/src/components/ScrollViewGesture.tsx
@@ -65,7 +65,7 @@ const IScrollViewGesture: React.FC> = (props) => {
const maxPage = dataLength;
const isHorizontal = useDerivedValue(() => !vertical, [vertical]);
const max = useSharedValue(0);
- const panOffset = useSharedValue(0);
+ const panOffset = useSharedValue(undefined); // set to undefined when not actively in a pan gesture
const touching = useSharedValue(false);
const validStart = useSharedValue(false);
const scrollEndTranslation = useSharedValue(0);
@@ -79,7 +79,8 @@ const IScrollViewGesture: React.FC> = (props) => {
"worklet";
if (!loop && !overscrollEnabled) {
- const { width: containerWidth = 0 } = measure(containerRef);
+ const measurement = measure(containerRef);
+ const containerWidth = measurement?.width || 0;
// If the item's total width is less than the container's width, then there is no need to scroll.
if (dataLength * size < containerWidth)
@@ -291,6 +292,20 @@ const IScrollViewGesture: React.FC> = (props) => {
const onGestureUpdate = useCallback((e: PanGestureHandlerEventPayload) => {
"worklet";
+ if (panOffset.value === undefined) {
+ // This may happen if `onGestureStart` is called as a part of the
+ // JS thread (instead of the UI thread / worklet). If so, when
+ // `onGestureStart` sets panOffset.value, the set will be asynchronous,
+ // and so it may not actually occur before `onGestureUpdate` is called.
+ //
+ // Keeping this value as `undefined` when it is not active protects us
+ // from the situation where we may use the previous value for panOffset
+ // instead; this would cause a visual flicker in the carousel.
+
+ // console.warn("onGestureUpdate: panOffset is undefined");
+ return;
+ }
+
if (validStart.value) {
validStart.value = false;
cancelAnimation(translation);
@@ -335,6 +350,11 @@ const IScrollViewGesture: React.FC> = (props) => {
const onGestureEnd = useCallback((e: GestureStateChangeEvent, _success: boolean) => {
"worklet";
+ if (panOffset.value === undefined) {
+ // console.warn("onGestureEnd: panOffset is undefined");
+ return;
+ }
+
const { velocityX, velocityY, translationX, translationY } = e;
const scrollEndVelocityValue = isHorizontal.value
? velocityX
@@ -381,6 +401,8 @@ const IScrollViewGesture: React.FC> = (props) => {
if (!loop)
touching.value = false;
+
+ panOffset.value = undefined;
}, [
size,
loop,
diff --git a/src/components/rnr-demo.test.tsx b/src/components/rnr-demo.test.tsx
index 3bdf3ec7..ed86ba48 100644
--- a/src/components/rnr-demo.test.tsx
+++ b/src/components/rnr-demo.test.tsx
@@ -27,7 +27,7 @@ describe("useSharedValue", () => {
expect(
typeof wrapper.root.children[0] !== "string"
- ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity
+ ? wrapper.root.children[0].props.style.jestAnimatedStyle.current.value.opacity
: false,
).toBe(initialValue);
@@ -36,7 +36,7 @@ describe("useSharedValue", () => {
expect(
typeof wrapper.root.children[0] !== "string"
- ? wrapper.root.children[0].props.style.animatedStyle.current.value.opacity
+ ? wrapper.root.children[0].props.style.jestAnimatedStyle.current.value.opacity
: false,
).toBe(initialValue);
});
diff --git a/src/hooks/useAutoPlay.ts b/src/hooks/useAutoPlay.ts
index 64ef1d78..0799ad75 100644
--- a/src/hooks/useAutoPlay.ts
+++ b/src/hooks/useAutoPlay.ts
@@ -16,26 +16,37 @@ export function useAutoPlay(opts: {
} = opts;
const { prev, next } = carouselController;
- const timer = React.useRef>();
+ const lastTimestampRef = React.useRef(null);
const stopped = React.useRef(!autoPlay);
const play = React.useCallback(() => {
if (stopped.current)
return;
- timer.current && clearTimeout(timer.current);
- timer.current = setTimeout(() => {
- autoPlayReverse
- ? prev({ onFinished: play })
- : next({ onFinished: play });
- }, autoPlayInterval);
+ const currentTimestamp = Date.now();
+
+ if (lastTimestampRef.current) {
+ const elapsed = currentTimestamp - lastTimestampRef.current;
+
+ if (elapsed >= (autoPlayInterval ?? 1000)) {
+ autoPlayReverse
+ ? prev({ onFinished: play })
+ : next({ onFinished: play });
+ lastTimestampRef.current = currentTimestamp;
+ }
+ }
+ else {
+ lastTimestampRef.current = currentTimestamp;
+ }
+
+ requestAnimationFrame(play);
}, [autoPlayReverse, autoPlayInterval, prev, next]);
const pause = React.useCallback(() => {
if (!autoPlay)
return;
- timer.current && clearTimeout(timer.current);
+ lastTimestampRef.current = null;
stopped.current = true;
}, [autoPlay]);
@@ -44,7 +55,8 @@ export function useAutoPlay(opts: {
return;
stopped.current = false;
- play();
+ lastTimestampRef.current = Date.now();
+ requestAnimationFrame(play);
}, [play, autoPlay]);
React.useEffect(() => {
@@ -53,7 +65,10 @@ export function useAutoPlay(opts: {
else
pause();
- return pause;
+ return () => {
+ lastTimestampRef.current = null;
+ stopped.current = true;
+ };
}, [pause, start, autoPlay]);
return {
diff --git a/src/hooks/useOffsetX.ts b/src/hooks/useOffsetX.ts
index 08caa0b8..43914679 100644
--- a/src/hooks/useOffsetX.ts
+++ b/src/hooks/useOffsetX.ts
@@ -1,6 +1,6 @@
import type Animated from "react-native-reanimated";
import {
- Extrapolate,
+ Extrapolation,
interpolate,
useDerivedValue,
} from "react-native-reanimated";
@@ -76,7 +76,7 @@ export const useOffsetX = (opts: IOpts, visibleRanges: IVisibleRanges) => {
handlerOffset.value,
inputRange,
outputRange,
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
}
diff --git a/src/hooks/useOnProgressChange.ts b/src/hooks/useOnProgressChange.ts
index 895ce91c..e539519d 100644
--- a/src/hooks/useOnProgressChange.ts
+++ b/src/hooks/useOnProgressChange.ts
@@ -19,6 +19,12 @@ export function useOnProgressChange(
const { autoFillData, loop, offsetX, size, rawDataLength, onProgressChange }
= opts;
+ // remember `isFunc` here because we can't accurately check typeof
+ // from within useAnimatedReaction because its code has been workletized;
+ // the `onProgressChange` value will be typeof "object" from within
+ // the worklet code even if it's a function.
+ const isFunc = typeof onProgressChange === "function";
+
useAnimatedReaction(
() => offsetX.value,
(_value) => {
@@ -43,7 +49,7 @@ export function useOnProgressChange(
absoluteProgress = rawDataLength - absoluteProgress;
if (onProgressChange) {
- if (typeof onProgressChange === "function")
+ if (isFunc)
runOnJS(onProgressChange)(value, absoluteProgress);
else
diff --git a/src/hooks/usePanGestureProxy.test.tsx b/src/hooks/usePanGestureProxy.test.tsx
index 4bd649c2..4e22f95d 100644
--- a/src/hooks/usePanGestureProxy.test.tsx
+++ b/src/hooks/usePanGestureProxy.test.tsx
@@ -140,6 +140,29 @@ describe("Using RNGH v2 gesture API", () => {
expect.objectContaining({ translationX: 20 }),
);
});
+
+ it("does not include console.error in the output", () => {
+ // if react-native-gesture-handler detects that some handlers are
+ // workletized and some are not, it will log an error to the
+ // console. We'd like to make sure that this doesn't happen.
+
+ // The error that would be shown looks like:
+ // [react-native-gesture-handler] Some of the callbacks in the gesture are worklets and some are not. Either make sure that all calbacks are marked as 'worklet' if you wish to run them on the UI thread or use '.runOnJS(true)' modifier on the gesture explicitly to run all callbacks on the JS thread.
+
+ const panHandlers = mockedEventHandlers();
+ const panHandlersFromUser = mockedEventHandlersFromUser();
+
+ jest.spyOn(console, "error");
+
+ render();
+ fireGestureHandler(getByGestureTestId("pan"), [
+ { state: State.BEGAN },
+ { state: State.ACTIVE },
+ { state: State.END },
+ ]);
+
+ expect(console.error).not.toBeCalled();
+ });
});
describe("Event list validation", () => {
diff --git a/src/hooks/usePanGestureProxy.ts b/src/hooks/usePanGestureProxy.ts
index 82d2a62b..72f4c895 100644
--- a/src/hooks/usePanGestureProxy.ts
+++ b/src/hooks/usePanGestureProxy.ts
@@ -27,20 +27,32 @@ export const usePanGestureProxy = (
// Save the original gesture callbacks
const originalGestures = {
+ onBegin: gesture.onBegin,
onStart: gesture.onStart,
onUpdate: gesture.onUpdate,
onEnd: gesture.onEnd,
+ onFinalize: gesture.onFinalize,
};
// Save the user defined gesture callbacks
const userDefinedConflictGestures: {
+ onBegin?: Parameters<(typeof gesture)["onBegin"]>[0]
onStart?: Parameters<(typeof gesture)["onStart"]>[0]
onUpdate?: Parameters<(typeof gesture)["onUpdate"]>[0]
onEnd?: Parameters<(typeof gesture)["onEnd"]>[0]
+ onFinalize?: Parameters<(typeof gesture)["onFinalize"]>[0]
} = {
+ onBegin: undefined,
onStart: undefined,
onUpdate: undefined,
onEnd: undefined,
+ onFinalize: undefined,
+ };
+
+ const fakeOnBegin: typeof gesture.onBegin = (cb) => {
+ // Using fakeOnBegin to save the user defined callback
+ userDefinedConflictGestures.onBegin = cb;
+ return gesture;
};
const fakeOnStart: typeof gesture.onStart = (cb) => {
@@ -61,40 +73,66 @@ export const usePanGestureProxy = (
return gesture;
};
+ const fakeOnFinalize: typeof gesture.onFinalize = (cb) => {
+ // Using fakeOnFinalize to save the user defined callback
+ userDefinedConflictGestures.onFinalize = cb;
+ return gesture;
+ };
+
// Setup the fake callbacks
+ gesture.onBegin = fakeOnBegin;
gesture.onStart = fakeOnStart;
gesture.onUpdate = fakeOnUpdate;
gesture.onEnd = fakeOnEnd;
+ gesture.onFinalize = fakeOnFinalize;
if (onConfigurePanGesture)
// Get the gesture with the user defined configuration
onConfigurePanGesture(gesture);
// Restore the original callbacks
+ gesture.onBegin = originalGestures.onBegin;
gesture.onStart = originalGestures.onStart;
gesture.onUpdate = originalGestures.onUpdate;
gesture.onEnd = originalGestures.onEnd;
+ gesture.onFinalize = originalGestures.onFinalize;
// Setup the original callbacks with the user defined callbacks
gesture
+ .onBegin((e) => {
+ "worklet";
+
+ if (userDefinedConflictGestures.onBegin)
+ userDefinedConflictGestures.onBegin(e);
+ })
.onStart((e) => {
+ "worklet";
onGestureStart(e);
if (userDefinedConflictGestures.onStart)
userDefinedConflictGestures.onStart(e);
})
.onUpdate((e) => {
+ "worklet";
onGestureUpdate(e);
if (userDefinedConflictGestures.onUpdate)
userDefinedConflictGestures.onUpdate(e);
})
.onEnd((e, success) => {
+ "worklet";
onGestureEnd(e, success);
if (userDefinedConflictGestures.onEnd)
userDefinedConflictGestures.onEnd(e, success);
- });
+ })
+ .onFinalize((e, success) => {
+ "worklet";
+
+ if (userDefinedConflictGestures.onFinalize)
+ userDefinedConflictGestures.onFinalize(e, success);
+ })
+ ;
return gesture;
}, [
diff --git a/src/layouts/parallax.ts b/src/layouts/parallax.ts
index 2f8246f3..9b802fed 100644
--- a/src/layouts/parallax.ts
+++ b/src/layouts/parallax.ts
@@ -1,4 +1,4 @@
-import { Extrapolate, interpolate } from "react-native-reanimated";
+import { Extrapolation, interpolate } from "react-native-reanimated";
import type { IComputedDirectionTypes } from "../types";
@@ -56,7 +56,7 @@ export function parallaxLayout(
value,
[-1, 0, 1],
[0, size, 0],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
const scale = interpolate(
@@ -67,7 +67,7 @@ export function parallaxLayout(
parallaxScrollingScale,
parallaxAdjacentItemScale,
],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
return {
diff --git a/src/layouts/stack.test.ts b/src/layouts/stack.test.ts
new file mode 100644
index 00000000..c8e0c1a7
--- /dev/null
+++ b/src/layouts/stack.test.ts
@@ -0,0 +1,53 @@
+import { horizontalStackLayout } from "./stack";
+
+describe("horizontalStackLayout", () => {
+ it("should make the rotateZDeg works properly when it is passed in horizontal-stack mode through modeConfig", () => {
+ const screenWidth = 375;
+
+ const calculator = horizontalStackLayout({
+ showLength: 3,
+ snapDirection: "left",
+ moveSize: screenWidth,
+ stackInterval: 18,
+ scaleInterval: 0.04,
+ opacityInterval: 0.1,
+ rotateZDeg: 30,
+ });
+
+ expect(calculator(-0.5)).toMatchInlineSnapshot(`
+ {
+ "opacity": 0.625,
+ "transform": [
+ {
+ "translateX": -187.5,
+ },
+ {
+ "scale": 1,
+ },
+ {
+ "rotateZ": "-15deg",
+ },
+ ],
+ "zIndex": 150,
+ }
+ `);
+
+ expect(calculator(-1)).toMatchInlineSnapshot(`
+ {
+ "opacity": 0.25,
+ "transform": [
+ {
+ "translateX": -375,
+ },
+ {
+ "scale": 1,
+ },
+ {
+ "rotateZ": "-30deg",
+ },
+ ],
+ "zIndex": 200,
+ }
+ `);
+ });
+});
diff --git a/src/layouts/stack.ts b/src/layouts/stack.ts
index 77a9b57c..518cc9e3 100644
--- a/src/layouts/stack.ts
+++ b/src/layouts/stack.ts
@@ -1,7 +1,7 @@
import { useMemo } from "react";
import type { TransformsStyle, ViewStyle } from "react-native";
import { Dimensions } from "react-native";
-import { Extrapolate, interpolate } from "react-native-reanimated";
+import { Extrapolation, interpolate } from "react-native-reanimated";
import type { IComputedDirectionTypes, CustomConfig } from "../types";
@@ -25,12 +25,12 @@ export type TStackModeProps = IComputedDirectionTypes<{
/**
* Stack animation style.
* @default
- * mode: 'vertical',
* snapDirection: 'right',
* moveSize: window.width,
* stackInterval: 30,
* scaleInterval: 0.08,
* rotateZDeg: 135,
+ * opacityInterval: 0.1,
*/
modeConfig?: ILayoutConfig
}>;
@@ -77,19 +77,19 @@ export function horizontalStackLayout(modeConfig: ILayoutConfig = {}) {
value,
inputRange,
[-moveSize, 0, validLength * stackInterval],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
scale = interpolate(
value,
inputRange,
[1, 1, 1 - validLength * scaleInterval],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
rotateZ = `${interpolate(
value,
inputRange,
[-rotateZDeg, 0, 0],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
)}deg`;
}
else if (snapDirection === "right") {
@@ -97,19 +97,19 @@ export function horizontalStackLayout(modeConfig: ILayoutConfig = {}) {
value,
inputRange,
[-validLength * stackInterval, 0, moveSize],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
scale = interpolate(
value,
inputRange,
[1 - validLength * scaleInterval, 1, 1],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
rotateZ = `${interpolate(
value,
inputRange,
[0, 0, rotateZDeg],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
)}deg`;
}
@@ -193,25 +193,25 @@ export function verticalStackLayout(modeConfig: ILayoutConfig = {}) {
value,
inputRange,
[-moveSize, 0, 0],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
scale = interpolate(
value,
inputRange,
[1, 1, 1 - validLength * scaleInterval],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
rotateZ = `${interpolate(
value,
inputRange,
[-rotateZDeg, 0, 0],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
)}deg`;
translateY = interpolate(
value,
inputRange,
[0, 0, validLength * stackInterval],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
}
else if (snapDirection === "right") {
@@ -219,25 +219,25 @@ export function verticalStackLayout(modeConfig: ILayoutConfig = {}) {
value,
inputRange,
[0, 0, moveSize],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
scale = interpolate(
value,
inputRange,
[1 - validLength * scaleInterval, 1, 1],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
rotateZ = `${interpolate(
value,
inputRange,
[0, 0, rotateZDeg],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
)}deg`;
translateY = interpolate(
value,
inputRange,
[validLength * stackInterval, 0, 0],
- Extrapolate.CLAMP,
+ Extrapolation.CLAMP,
);
}
diff --git a/src/types.ts b/src/types.ts
index 03636b31..e637f52b 100644
--- a/src/types.ts
+++ b/src/types.ts
@@ -1,7 +1,6 @@
import type { StyleProp, ViewStyle } from "react-native";
import type { PanGesture } from "react-native-gesture-handler";
import type {
- AnimatedStyleProp,
SharedValue,
WithSpringConfig,
WithTimingConfig,
@@ -174,7 +173,7 @@ export type TCarouselProps = {
* Custom animations.
* Must use `worklet`, Details: https://docs.swmansion.com/react-native-reanimated/docs/2.2.0/worklets/
*/
- customAnimation?: (value: number) => AnimatedStyleProp
+ customAnimation?: (value: number) => ViewStyle
/**
* Render carousel item.
*/
diff --git a/tsconfig.json b/tsconfig.json
index 40d9ba45..f450f4a0 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,28 +1,28 @@
{
- "compilerOptions": {
- "baseUrl": "./",
- "paths": {
- "react-native-reanimated-carousel": ["./src/index"]
- },
- "allowUnreachableCode": false,
- "allowUnusedLabels": false,
- "esModuleInterop": true,
- "forceConsistentCasingInFileNames": true,
- "jsx": "react",
- "lib": ["esnext"],
- "module": "esnext",
- "moduleResolution": "node",
- "noFallthroughCasesInSwitch": true,
- "noImplicitReturns": true,
- "noImplicitUseStrict": false,
- "noStrictGenericChecks": false,
- "noUnusedLocals": true,
- "noUnusedParameters": true,
- "resolveJsonModule": true,
- "skipLibCheck": true,
- "strict": true,
- "target": "esnext",
- "types": ["jest"]
+ "compilerOptions": {
+ "baseUrl": "./",
+ "paths": {
+ "react-native-reanimated-carousel": ["./src/index"]
},
- "exclude": ["example"]
+ "allowUnreachableCode": false,
+ "allowUnusedLabels": false,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "jsx": "react",
+ "lib": ["esnext"],
+ "module": "esnext",
+ "moduleResolution": "node",
+ "noFallthroughCasesInSwitch": true,
+ "noImplicitReturns": true,
+ "noImplicitUseStrict": false,
+ "noStrictGenericChecks": false,
+ "noUnusedLocals": true,
+ "noUnusedParameters": true,
+ "resolveJsonModule": true,
+ "skipLibCheck": true,
+ "strict": true,
+ "target": "esnext",
+ "types": ["jest"]
+ },
+ "exclude": ["example", "node_modules"]
}
diff --git a/yarn.lock b/yarn.lock
index a8b73c5a..49d152ab 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -40,6 +40,16 @@ __metadata:
languageName: node
linkType: hard
+"@babel/code-frame@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/code-frame@npm:7.24.7"
+ dependencies:
+ "@babel/highlight": "npm:^7.24.7"
+ picocolors: "npm:^1.0.0"
+ checksum: 4812e94885ba7e3213d49583a155fdffb05292330f0a9b2c41b49288da70cf3c746a3fda0bf1074041a6d741c33f8d7be24be5e96f41ef77395eeddc5c9ff624
+ languageName: node
+ linkType: hard
+
"@babel/compat-data@npm:^7.13.11, @babel/compat-data@npm:^7.16.8, @babel/compat-data@npm:^7.17.0":
version: 7.17.0
resolution: "@babel/compat-data@npm:7.17.0"
@@ -61,6 +71,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/compat-data@npm:^7.25.2":
+ version: 7.25.4
+ resolution: "@babel/compat-data@npm:7.25.4"
+ checksum: d37a8936cc355a9ca3050102e03d179bdae26bd2e5c99a977637376c192b23637a039795f153c849437a086727628c9860e2c6af92d7151396e2362c09176337
+ languageName: node
+ linkType: hard
+
"@babel/core@npm:^7.11.6":
version: 7.20.12
resolution: "@babel/core@npm:7.20.12"
@@ -153,6 +170,18 @@ __metadata:
languageName: node
linkType: hard
+"@babel/generator@npm:^7.25.6":
+ version: 7.25.6
+ resolution: "@babel/generator@npm:7.25.6"
+ dependencies:
+ "@babel/types": "npm:^7.25.6"
+ "@jridgewell/gen-mapping": "npm:^0.3.5"
+ "@jridgewell/trace-mapping": "npm:^0.3.25"
+ jsesc: "npm:^2.5.1"
+ checksum: 541e4fbb6ea7806f44232d70f25bf09dee9a57fe43d559e375536870ca5261ebb4647fec3af40dcbb3325ea2a49aff040e12a4e6f88609eaa88f10c4e27e31f8
+ languageName: node
+ linkType: hard
+
"@babel/generator@npm:^7.7.2":
version: 7.20.7
resolution: "@babel/generator@npm:7.20.7"
@@ -182,6 +211,15 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-annotate-as-pure@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/helper-annotate-as-pure@npm:7.24.7"
+ dependencies:
+ "@babel/types": "npm:^7.24.7"
+ checksum: a9017bfc1c4e9f2225b967fbf818004703de7cf29686468b54002ffe8d6b56e0808afa20d636819fcf3a34b89ba72f52c11bdf1d69f303928ee10d92752cad95
+ languageName: node
+ linkType: hard
+
"@babel/helper-builder-binary-assignment-operator-visitor@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/helper-builder-binary-assignment-operator-visitor@npm:7.16.7"
@@ -222,6 +260,19 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-compilation-targets@npm:^7.25.2":
+ version: 7.25.2
+ resolution: "@babel/helper-compilation-targets@npm:7.25.2"
+ dependencies:
+ "@babel/compat-data": "npm:^7.25.2"
+ "@babel/helper-validator-option": "npm:^7.24.8"
+ browserslist: "npm:^4.23.1"
+ lru-cache: "npm:^5.1.1"
+ semver: "npm:^6.3.1"
+ checksum: eccb2d75923d2d4d596f9ff64716e8664047c4192f1b44c7d5c07701d4a3498ac2587a72ddae1046e65a501bc630eb7df4557958b08ec2dcf5b4a264a052f111
+ languageName: node
+ linkType: hard
+
"@babel/helper-create-class-features-plugin@npm:^7.16.10, @babel/helper-create-class-features-plugin@npm:^7.16.7":
version: 7.17.1
resolution: "@babel/helper-create-class-features-plugin@npm:7.17.1"
@@ -275,6 +326,23 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-create-class-features-plugin@npm:^7.25.4":
+ version: 7.25.4
+ resolution: "@babel/helper-create-class-features-plugin@npm:7.25.4"
+ dependencies:
+ "@babel/helper-annotate-as-pure": "npm:^7.24.7"
+ "@babel/helper-member-expression-to-functions": "npm:^7.24.8"
+ "@babel/helper-optimise-call-expression": "npm:^7.24.7"
+ "@babel/helper-replace-supers": "npm:^7.25.0"
+ "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7"
+ "@babel/traverse": "npm:^7.25.4"
+ semver: "npm:^6.3.1"
+ peerDependencies:
+ "@babel/core": ^7.0.0
+ checksum: 47218da9fd964af30d41f0635d9e33eed7518e03aa8f10c3eb8a563bb2c14f52be3e3199db5912ae0e26058c23bb511c811e565c55ecec09427b04b867ed13c2
+ languageName: node
+ linkType: hard
+
"@babel/helper-create-regexp-features-plugin@npm:^7.16.7":
version: 7.17.0
resolution: "@babel/helper-create-regexp-features-plugin@npm:7.17.0"
@@ -300,6 +368,19 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-create-regexp-features-plugin@npm:^7.24.7":
+ version: 7.25.2
+ resolution: "@babel/helper-create-regexp-features-plugin@npm:7.25.2"
+ dependencies:
+ "@babel/helper-annotate-as-pure": "npm:^7.24.7"
+ regexpu-core: "npm:^5.3.1"
+ semver: "npm:^6.3.1"
+ peerDependencies:
+ "@babel/core": ^7.0.0
+ checksum: 33dd627eef9e4229aba66789efd8fb7342fc2667b821d4b7947c7294f6d472cf025ff2db9b358a1e03de98376de44e839f0611a456a57127fd6e4b4dbfc96c51
+ languageName: node
+ linkType: hard
+
"@babel/helper-define-polyfill-provider@npm:^0.3.1":
version: 0.3.1
resolution: "@babel/helper-define-polyfill-provider@npm:0.3.1"
@@ -425,6 +506,16 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-member-expression-to-functions@npm:^7.24.8":
+ version: 7.24.8
+ resolution: "@babel/helper-member-expression-to-functions@npm:7.24.8"
+ dependencies:
+ "@babel/traverse": "npm:^7.24.8"
+ "@babel/types": "npm:^7.24.8"
+ checksum: ac878761cfd0a46c081cda0da75cc186f922cf16e8ecdd0c4fb6dca4330d9fe4871b41a9976224cf9669c9e7fe0421b5c27349f2e99c125fa0be871b327fa770
+ languageName: node
+ linkType: hard
+
"@babel/helper-module-imports@npm:^7.12.13, @babel/helper-module-imports@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/helper-module-imports@npm:7.16.7"
@@ -492,6 +583,15 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-optimise-call-expression@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/helper-optimise-call-expression@npm:7.24.7"
+ dependencies:
+ "@babel/types": "npm:^7.24.7"
+ checksum: da7a7f2d1bb1be4cffd5fa820bd605bc075c7dd014e0458f608bb6f34f450fe9412c8cea93e788227ab396e0e02c162d7b1db3fbcb755a6360e354c485d61df0
+ languageName: node
+ linkType: hard
+
"@babel/helper-plugin-utils@npm:^7.0.0, @babel/helper-plugin-utils@npm:^7.10.4, @babel/helper-plugin-utils@npm:^7.12.13, @babel/helper-plugin-utils@npm:^7.13.0, @babel/helper-plugin-utils@npm:^7.14.5, @babel/helper-plugin-utils@npm:^7.16.7, @babel/helper-plugin-utils@npm:^7.8.0, @babel/helper-plugin-utils@npm:^7.8.3":
version: 7.16.7
resolution: "@babel/helper-plugin-utils@npm:7.16.7"
@@ -520,6 +620,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-plugin-utils@npm:^7.24.7, @babel/helper-plugin-utils@npm:^7.24.8":
+ version: 7.24.8
+ resolution: "@babel/helper-plugin-utils@npm:7.24.8"
+ checksum: adbc9fc1142800a35a5eb0793296924ee8057fe35c61657774208670468a9fbfbb216f2d0bc46c680c5fefa785e5ff917cc1674b10bd75cdf9a6aa3444780630
+ languageName: node
+ linkType: hard
+
"@babel/helper-remap-async-to-generator@npm:^7.16.8":
version: 7.16.8
resolution: "@babel/helper-remap-async-to-generator@npm:7.16.8"
@@ -570,6 +677,19 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-replace-supers@npm:^7.25.0":
+ version: 7.25.0
+ resolution: "@babel/helper-replace-supers@npm:7.25.0"
+ dependencies:
+ "@babel/helper-member-expression-to-functions": "npm:^7.24.8"
+ "@babel/helper-optimise-call-expression": "npm:^7.24.7"
+ "@babel/traverse": "npm:^7.25.0"
+ peerDependencies:
+ "@babel/core": ^7.0.0
+ checksum: 97c6c17780cb9692132f7243f5a21fb6420104cb8ff8752dc03cfc9a1912a243994c0290c77ff096637ab6f2a7363b63811cfc68c2bad44e6b39460ac2f6a63f
+ languageName: node
+ linkType: hard
+
"@babel/helper-simple-access@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/helper-simple-access@npm:7.16.7"
@@ -606,6 +726,16 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-skip-transparent-expression-wrappers@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/helper-skip-transparent-expression-wrappers@npm:7.24.7"
+ dependencies:
+ "@babel/traverse": "npm:^7.24.7"
+ "@babel/types": "npm:^7.24.7"
+ checksum: 784a6fdd251a9a7e42ccd04aca087ecdab83eddc60fda76a2950e00eb239cc937d3c914266f0cc476298b52ac3f44ffd04c358e808bd17552a7e008d75494a77
+ languageName: node
+ linkType: hard
+
"@babel/helper-split-export-declaration@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/helper-split-export-declaration@npm:7.16.7"
@@ -654,6 +784,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-string-parser@npm:^7.24.8":
+ version: 7.24.8
+ resolution: "@babel/helper-string-parser@npm:7.24.8"
+ checksum: 6d1bf8f27dd725ce02bdc6dffca3c95fb9ab8a06adc2edbd9c1c9d68500274230d1a609025833ed81981eff560045b6b38f7b4c6fb1ab19fc90e5004e3932535
+ languageName: node
+ linkType: hard
+
"@babel/helper-validator-identifier@npm:^7.15.7, @babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1":
version: 7.19.1
resolution: "@babel/helper-validator-identifier@npm:7.19.1"
@@ -682,6 +819,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-validator-identifier@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/helper-validator-identifier@npm:7.24.7"
+ checksum: 86875063f57361471b531dbc2ea10bbf5406e12b06d249b03827d361db4cad2388c6f00936bcd9dc86479f7e2c69ea21412c2228d4b3672588b754b70a449d4b
+ languageName: node
+ linkType: hard
+
"@babel/helper-validator-option@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/helper-validator-option@npm:7.16.7"
@@ -703,6 +847,13 @@ __metadata:
languageName: node
linkType: hard
+"@babel/helper-validator-option@npm:^7.24.8":
+ version: 7.24.8
+ resolution: "@babel/helper-validator-option@npm:7.24.8"
+ checksum: a52442dfa74be6719c0608fee3225bd0493c4057459f3014681ea1a4643cd38b68ff477fe867c4b356da7330d085f247f0724d300582fa4ab9a02efaf34d107c
+ languageName: node
+ linkType: hard
+
"@babel/helper-wrap-function@npm:^7.16.8":
version: 7.16.8
resolution: "@babel/helper-wrap-function@npm:7.16.8"
@@ -770,6 +921,18 @@ __metadata:
languageName: node
linkType: hard
+"@babel/highlight@npm:^7.24.7":
+ version: 7.24.7
+ resolution: "@babel/highlight@npm:7.24.7"
+ dependencies:
+ "@babel/helper-validator-identifier": "npm:^7.24.7"
+ chalk: "npm:^2.4.2"
+ js-tokens: "npm:^4.0.0"
+ picocolors: "npm:^1.0.0"
+ checksum: 69b73f38cdd4f881b09b939a711e76646da34f4834f4ce141d7a49a6bb1926eab1c594148970a8aa9360398dff800f63aade4e81fafdd7c8d8a8489ea93bfec1
+ languageName: node
+ linkType: hard
+
"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.14.7, @babel/parser@npm:^7.17.3, @babel/parser@npm:^7.7.0":
version: 7.17.3
resolution: "@babel/parser@npm:7.17.3"
@@ -797,6 +960,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/parser@npm:^7.25.0, @babel/parser@npm:^7.25.6":
+ version: 7.25.6
+ resolution: "@babel/parser@npm:7.25.6"
+ dependencies:
+ "@babel/types": "npm:^7.25.6"
+ bin:
+ parser: ./bin/babel-parser.js
+ checksum: 830aab72116aa14eb8d61bfa8f9d69fc8f3a43d909ce993cb4350ae14d3af1a2f740a54410a22d821c48a253263643dfecbc094f9608e6a70ce9ff3c0bbfe91a
+ languageName: node
+ linkType: hard
+
"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@npm:7.16.7"
@@ -1408,6 +1582,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/plugin-transform-arrow-functions@npm:^7.0.0-0":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-arrow-functions@npm:7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils": "npm:^7.24.7"
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 6720173645826046878015c579c2ca9d93cdba79a2832f0180f5cf147d9817c85bf9c8338b16d6bdaa71f87809b7a194a6902e6c82ec00b6354aca6b40abe5e6
+ languageName: node
+ linkType: hard
+
"@babel/plugin-transform-async-to-generator@npm:^7.16.8":
version: 7.16.8
resolution: "@babel/plugin-transform-async-to-generator@npm:7.16.8"
@@ -1456,6 +1641,18 @@ __metadata:
languageName: node
linkType: hard
+"@babel/plugin-transform-class-properties@npm:^7.0.0-0":
+ version: 7.25.4
+ resolution: "@babel/plugin-transform-class-properties@npm:7.25.4"
+ dependencies:
+ "@babel/helper-create-class-features-plugin": "npm:^7.25.4"
+ "@babel/helper-plugin-utils": "npm:^7.24.8"
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 203a21384303d66fb5d841b77cba8b8994623ff4d26d208e3d05b36858c4919626a8d74871fa4b9195310c2e7883bf180359c4f5a76481ea55190c224d9746f4
+ languageName: node
+ linkType: hard
+
"@babel/plugin-transform-classes@npm:^7.0.0, @babel/plugin-transform-classes@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/plugin-transform-classes@npm:7.16.7"
@@ -1474,6 +1671,22 @@ __metadata:
languageName: node
linkType: hard
+"@babel/plugin-transform-classes@npm:^7.0.0-0":
+ version: 7.25.4
+ resolution: "@babel/plugin-transform-classes@npm:7.25.4"
+ dependencies:
+ "@babel/helper-annotate-as-pure": "npm:^7.24.7"
+ "@babel/helper-compilation-targets": "npm:^7.25.2"
+ "@babel/helper-plugin-utils": "npm:^7.24.8"
+ "@babel/helper-replace-supers": "npm:^7.25.0"
+ "@babel/traverse": "npm:^7.25.4"
+ globals: "npm:^11.1.0"
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 17db5889803529bec366c6f0602687fdd605c2fec8cb6fe918261cb55cd89e9d8c9aa2aa6f3fd64d36492ce02d7d0752b09a284b0f833c1185f7dad9b9506310
+ languageName: node
+ linkType: hard
+
"@babel/plugin-transform-computed-properties@npm:^7.0.0, @babel/plugin-transform-computed-properties@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/plugin-transform-computed-properties@npm:7.16.7"
@@ -1713,14 +1926,15 @@ __metadata:
languageName: node
linkType: hard
-"@babel/plugin-transform-object-assign@npm:^7.16.7":
- version: 7.16.7
- resolution: "@babel/plugin-transform-object-assign@npm:7.16.7"
+"@babel/plugin-transform-nullish-coalescing-operator@npm:^7.0.0-0":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-nullish-coalescing-operator@npm:7.24.7"
dependencies:
- "@babel/helper-plugin-utils": "npm:^7.16.7"
+ "@babel/helper-plugin-utils": "npm:^7.24.7"
+ "@babel/plugin-syntax-nullish-coalescing-operator": "npm:^7.8.3"
peerDependencies:
"@babel/core": ^7.0.0-0
- checksum: 9f5160b5730b3d415367cc4ecf1b14f864cd7f1c80d5207a2fa39d90e0359eadf32426933cec444533e9c69930df032f35460b1f3b5e85c7a103ba6420a51eae
+ checksum: 113cd24b6ce4d0a8e54ad9324428244942ce752a3fd38f8b615c3a786641ec18a00a01b662fe4cbebf369358f5904a975bbde0a977b839f2438b16f0d7d1dd36
languageName: node
linkType: hard
@@ -1736,6 +1950,19 @@ __metadata:
languageName: node
linkType: hard
+"@babel/plugin-transform-optional-chaining@npm:^7.0.0-0":
+ version: 7.24.8
+ resolution: "@babel/plugin-transform-optional-chaining@npm:7.24.8"
+ dependencies:
+ "@babel/helper-plugin-utils": "npm:^7.24.8"
+ "@babel/helper-skip-transparent-expression-wrappers": "npm:^7.24.7"
+ "@babel/plugin-syntax-optional-chaining": "npm:^7.8.3"
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: 1f873fb9d86c280b64dfe5ebc59244b459b717ed72a7682da2386db3d9e11fc9d831cfc2e11d37262b4325a7a0e3ccbccfb8cd0b944caf199d3c9e03fff7b0af
+ languageName: node
+ linkType: hard
+
"@babel/plugin-transform-parameters@npm:^7.0.0, @babel/plugin-transform-parameters@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/plugin-transform-parameters@npm:7.16.7"
@@ -1889,6 +2116,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/plugin-transform-shorthand-properties@npm:^7.0.0-0":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-shorthand-properties@npm:7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils": "npm:^7.24.7"
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: c68c2be965007e0cb6667daa209bc0af877cab4b327ef2e21b2114c38554243c3f7fdcc5b03679b20f72a26d966aa646af771f3165c882067e85a3887647f028
+ languageName: node
+ linkType: hard
+
"@babel/plugin-transform-spread@npm:^7.0.0, @babel/plugin-transform-spread@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/plugin-transform-spread@npm:7.16.7"
@@ -1923,6 +2161,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/plugin-transform-template-literals@npm:^7.0.0-0":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-template-literals@npm:7.24.7"
+ dependencies:
+ "@babel/helper-plugin-utils": "npm:^7.24.7"
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: ecf05a8511176d5570cb0d481577a407a4e8a9a430f86522d809e0ac2c823913e854ef9e2a1c83c0bd7c12489d82e1b48fabb52e697e80d6a6962125197593ca
+ languageName: node
+ linkType: hard
+
"@babel/plugin-transform-typeof-symbol@npm:^7.16.7":
version: 7.16.7
resolution: "@babel/plugin-transform-typeof-symbol@npm:7.16.7"
@@ -1997,6 +2246,18 @@ __metadata:
languageName: node
linkType: hard
+"@babel/plugin-transform-unicode-regex@npm:^7.0.0-0":
+ version: 7.24.7
+ resolution: "@babel/plugin-transform-unicode-regex@npm:7.24.7"
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin": "npm:^7.24.7"
+ "@babel/helper-plugin-utils": "npm:^7.24.7"
+ peerDependencies:
+ "@babel/core": ^7.0.0-0
+ checksum: b545310d0d592d75566b9cd158f4b8951e34d07d839656789d179b39b3fd92b32bd387cdfaf33a93e636609f3bfb9bb03d41f3e43be598116c9c6c80cc3418c4
+ languageName: node
+ linkType: hard
+
"@babel/preset-env@npm:^7.12.11":
version: 7.16.11
resolution: "@babel/preset-env@npm:7.16.11"
@@ -2250,6 +2511,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/template@npm:^7.25.0":
+ version: 7.25.0
+ resolution: "@babel/template@npm:7.25.0"
+ dependencies:
+ "@babel/code-frame": "npm:^7.24.7"
+ "@babel/parser": "npm:^7.25.0"
+ "@babel/types": "npm:^7.25.0"
+ checksum: 07ebecf6db8b28244b7397628e09c99e7a317b959b926d90455c7253c88df3677a5a32d1501d9749fe292a263ff51a4b6b5385bcabd5dadd3a48036f4d4949e0
+ languageName: node
+ linkType: hard
+
"@babel/traverse@npm:^7.13.0, @babel/traverse@npm:^7.16.7, @babel/traverse@npm:^7.16.8, @babel/traverse@npm:^7.17.0, @babel/traverse@npm:^7.17.3, @babel/traverse@npm:^7.7.0, @babel/traverse@npm:^7.7.4":
version: 7.17.3
resolution: "@babel/traverse@npm:7.17.3"
@@ -2286,6 +2558,21 @@ __metadata:
languageName: node
linkType: hard
+"@babel/traverse@npm:^7.24.7, @babel/traverse@npm:^7.24.8, @babel/traverse@npm:^7.25.0, @babel/traverse@npm:^7.25.4":
+ version: 7.25.6
+ resolution: "@babel/traverse@npm:7.25.6"
+ dependencies:
+ "@babel/code-frame": "npm:^7.24.7"
+ "@babel/generator": "npm:^7.25.6"
+ "@babel/parser": "npm:^7.25.6"
+ "@babel/template": "npm:^7.25.0"
+ "@babel/types": "npm:^7.25.6"
+ debug: "npm:^4.3.1"
+ globals: "npm:^11.1.0"
+ checksum: de75a918299bc27a44ec973e3f2fa8c7902bbd67bd5d39a0be656f3c1127f33ebc79c12696fbc8170a0b0e1072a966d4a2126578d7ea2e241b0aeb5d16edc738
+ languageName: node
+ linkType: hard
+
"@babel/traverse@npm:^7.7.2":
version: 7.20.12
resolution: "@babel/traverse@npm:7.20.12"
@@ -2326,6 +2613,17 @@ __metadata:
languageName: node
linkType: hard
+"@babel/types@npm:^7.24.7, @babel/types@npm:^7.24.8, @babel/types@npm:^7.25.0, @babel/types@npm:^7.25.6":
+ version: 7.25.6
+ resolution: "@babel/types@npm:7.25.6"
+ dependencies:
+ "@babel/helper-string-parser": "npm:^7.24.8"
+ "@babel/helper-validator-identifier": "npm:^7.24.7"
+ to-fast-properties: "npm:^2.0.0"
+ checksum: 7b54665e1b51f525fe0f451efdd9fe7a4a6dfba3fd4956c3530bc77336b66ffe3d78c093796ed044119b5d213176af7cf326f317a2057c538d575c6cefcb3562
+ languageName: node
+ linkType: hard
+
"@babel/types@npm:^7.8.3":
version: 7.23.5
resolution: "@babel/types@npm:7.23.5"
@@ -3313,6 +3611,17 @@ __metadata:
languageName: node
linkType: hard
+"@jridgewell/gen-mapping@npm:^0.3.5":
+ version: 0.3.5
+ resolution: "@jridgewell/gen-mapping@npm:0.3.5"
+ dependencies:
+ "@jridgewell/set-array": "npm:^1.2.1"
+ "@jridgewell/sourcemap-codec": "npm:^1.4.10"
+ "@jridgewell/trace-mapping": "npm:^0.3.24"
+ checksum: 81587b3c4dd8e6c60252122937cea0c637486311f4ed208b52b62aae2e7a87598f63ec330e6cd0984af494bfb16d3f0d60d3b21d7e5b4aedd2602ff3fe9d32e2
+ languageName: node
+ linkType: hard
+
"@jridgewell/resolve-uri@npm:3.1.0":
version: 3.1.0
resolution: "@jridgewell/resolve-uri@npm:3.1.0"
@@ -3320,6 +3629,13 @@ __metadata:
languageName: node
linkType: hard
+"@jridgewell/resolve-uri@npm:^3.1.0":
+ version: 3.1.2
+ resolution: "@jridgewell/resolve-uri@npm:3.1.2"
+ checksum: 97106439d750a409c22c8bff822d648f6a71f3aa9bc8e5129efdc36343cd3096ddc4eeb1c62d2fe48e9bdd4db37b05d4646a17114ecebd3bbcacfa2de51c3c1d
+ languageName: node
+ linkType: hard
+
"@jridgewell/set-array@npm:^1.0.1":
version: 1.1.2
resolution: "@jridgewell/set-array@npm:1.1.2"
@@ -3327,6 +3643,13 @@ __metadata:
languageName: node
linkType: hard
+"@jridgewell/set-array@npm:^1.2.1":
+ version: 1.2.1
+ resolution: "@jridgewell/set-array@npm:1.2.1"
+ checksum: 832e513a85a588f8ed4f27d1279420d8547743cc37fcad5a5a76fc74bb895b013dfe614d0eed9cb860048e6546b798f8f2652020b4b2ba0561b05caa8c654b10
+ languageName: node
+ linkType: hard
+
"@jridgewell/source-map@npm:^0.3.3":
version: 0.3.5
resolution: "@jridgewell/source-map@npm:0.3.5"
@@ -3351,6 +3674,13 @@ __metadata:
languageName: node
linkType: hard
+"@jridgewell/sourcemap-codec@npm:^1.4.14":
+ version: 1.5.0
+ resolution: "@jridgewell/sourcemap-codec@npm:1.5.0"
+ checksum: 4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd
+ languageName: node
+ linkType: hard
+
"@jridgewell/trace-mapping@npm:^0.3.12, @jridgewell/trace-mapping@npm:^0.3.15, @jridgewell/trace-mapping@npm:^0.3.9":
version: 0.3.17
resolution: "@jridgewell/trace-mapping@npm:0.3.17"
@@ -3371,6 +3701,16 @@ __metadata:
languageName: node
linkType: hard
+"@jridgewell/trace-mapping@npm:^0.3.24, @jridgewell/trace-mapping@npm:^0.3.25":
+ version: 0.3.25
+ resolution: "@jridgewell/trace-mapping@npm:0.3.25"
+ dependencies:
+ "@jridgewell/resolve-uri": "npm:^3.1.0"
+ "@jridgewell/sourcemap-codec": "npm:^1.4.14"
+ checksum: dced32160a44b49d531b80a4a2159dceab6b3ddf0c8e95a0deae4b0e894b172defa63d5ac52a19c2068e1fe7d31ea4ba931fbeec103233ecb4208953967120fc
+ languageName: node
+ linkType: hard
+
"@manypkg/find-root@npm:^1.1.0":
version: 1.1.0
resolution: "@manypkg/find-root@npm:1.1.0"
@@ -4344,6 +4684,13 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/types@npm:8.4.0":
+ version: 8.4.0
+ resolution: "@typescript-eslint/types@npm:8.4.0"
+ checksum: 962eb0b45ca7634264698086dadb917d96684bd8a88926026e0c314984e68d14e1f30e0291f196408935a507aa9e9976ec4d27fc6aa632d34295059b4e436bae
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/typescript-estree@npm:3.10.1":
version: 3.10.1
resolution: "@typescript-eslint/typescript-estree@npm:3.10.1"
@@ -4399,6 +4746,25 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/typescript-estree@npm:^8.4.0":
+ version: 8.4.0
+ resolution: "@typescript-eslint/typescript-estree@npm:8.4.0"
+ dependencies:
+ "@typescript-eslint/types": "npm:8.4.0"
+ "@typescript-eslint/visitor-keys": "npm:8.4.0"
+ debug: "npm:^4.3.4"
+ fast-glob: "npm:^3.3.2"
+ is-glob: "npm:^4.0.3"
+ minimatch: "npm:^9.0.4"
+ semver: "npm:^7.6.0"
+ ts-api-utils: "npm:^1.3.0"
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ checksum: ec3396795b877c8ea0c3f0bdfb67c60b5e195f94569c0581ae7b9f3acbed047714722ff908f0ea1cbf19c16aaaa57826c2069c6383fcb9a3ad29bc26898a7125
+ languageName: node
+ linkType: hard
+
"@typescript-eslint/utils@npm:5.41.0":
version: 5.41.0
resolution: "@typescript-eslint/utils@npm:5.41.0"
@@ -4464,6 +4830,16 @@ __metadata:
languageName: node
linkType: hard
+"@typescript-eslint/visitor-keys@npm:8.4.0":
+ version: 8.4.0
+ resolution: "@typescript-eslint/visitor-keys@npm:8.4.0"
+ dependencies:
+ "@typescript-eslint/types": "npm:8.4.0"
+ eslint-visitor-keys: "npm:^3.4.3"
+ checksum: 3ac1d15d1beca887b333b9f1da9d6b819da5f965dbd7eb1c76342574adeaffe584b27c7e00a0e7fb69db7f4c307eeb8dd4410bdf177d6b14395cdd52e3e205e7
+ languageName: node
+ linkType: hard
+
"@ungap/structured-clone@npm:^1.2.0":
version: 1.2.0
resolution: "@ungap/structured-clone@npm:1.2.0"
@@ -5271,6 +5647,20 @@ __metadata:
languageName: node
linkType: hard
+"browserslist@npm:^4.23.1":
+ version: 4.23.3
+ resolution: "browserslist@npm:4.23.3"
+ dependencies:
+ caniuse-lite: "npm:^1.0.30001646"
+ electron-to-chromium: "npm:^1.5.4"
+ node-releases: "npm:^2.0.18"
+ update-browserslist-db: "npm:^1.1.0"
+ bin:
+ browserslist: cli.js
+ checksum: e266d18c6c6c5becf9a1a7aa264477677b9796387972e8fce34854bb33dc1666194dc28389780e5dc6566e68a95e87ece2ce222e1c4ca93c2b75b61dfebd5f1c
+ languageName: node
+ linkType: hard
+
"bser@npm:2.1.1":
version: 2.1.1
resolution: "bser@npm:2.1.1"
@@ -5440,6 +5830,13 @@ __metadata:
languageName: node
linkType: hard
+"caniuse-lite@npm:^1.0.30001646":
+ version: 1.0.30001658
+ resolution: "caniuse-lite@npm:1.0.30001658"
+ checksum: e3baf3c68a4f00e3eab169e0952fde7100b3ab99491074a24b361a97054eed1bca3bfdfb0d9ae4b326bdb660a370032d9130a241608d484296f4b3bcebe540fb
+ languageName: node
+ linkType: hard
+
"caseless@npm:~0.12.0":
version: 0.12.0
resolution: "caseless@npm:0.12.0"
@@ -6643,6 +7040,13 @@ __metadata:
languageName: node
linkType: hard
+"electron-to-chromium@npm:^1.5.4":
+ version: 1.5.18
+ resolution: "electron-to-chromium@npm:1.5.18"
+ checksum: 7306acc2631dc56a866a169b2ec8588d153284910889ab271f8f36f68073c214191d5a2e24cc9f6ff3739567f43b3853d2a6380af0bc476d75b5548cbff82f0c
+ languageName: node
+ linkType: hard
+
"emittery@npm:^0.13.1":
version: 0.13.1
resolution: "emittery@npm:0.13.1"
@@ -7077,6 +7481,13 @@ __metadata:
languageName: node
linkType: hard
+"escalade@npm:^3.1.2":
+ version: 3.2.0
+ resolution: "escalade@npm:3.2.0"
+ checksum: 9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6
+ languageName: node
+ linkType: hard
+
"escape-html@npm:~1.0.3":
version: 1.0.3
resolution: "escape-html@npm:1.0.3"
@@ -7821,7 +8232,7 @@ __metadata:
languageName: node
linkType: hard
-"fast-glob@npm:^3.3.0":
+"fast-glob@npm:^3.3.0, fast-glob@npm:^3.3.2":
version: 3.3.2
resolution: "fast-glob@npm:3.3.2"
dependencies:
@@ -11511,6 +11922,15 @@ __metadata:
languageName: node
linkType: hard
+"minimatch@npm:^9.0.4":
+ version: 9.0.5
+ resolution: "minimatch@npm:9.0.5"
+ dependencies:
+ brace-expansion: "npm:^2.0.1"
+ checksum: dd6a8927b063aca6d910b119e1f2df6d2ce7d36eab91de83167dd136bb85e1ebff97b0d3de1cb08bd1f7e018ca170b4962479fefab5b2a69e2ae12cb2edc8348
+ languageName: node
+ linkType: hard
+
"minimist-options@npm:4.1.0, minimist-options@npm:^4.0.2":
version: 4.1.0
resolution: "minimist-options@npm:4.1.0"
@@ -11854,6 +12274,13 @@ __metadata:
languageName: node
linkType: hard
+"node-releases@npm:^2.0.18":
+ version: 2.0.18
+ resolution: "node-releases@npm:2.0.18"
+ checksum: 241e5fa9556f1c12bafb83c6c3e94f8cf3d8f2f8f904906ecef6e10bcaa1d59aa61212d4651bec70052015fc54bd3fdcdbe7fc0f638a17e6685aa586c076ec4e
+ languageName: node
+ linkType: hard
+
"node-releases@npm:^2.0.6":
version: 2.0.8
resolution: "node-releases@npm:2.0.8"
@@ -12446,6 +12873,13 @@ __metadata:
languageName: node
linkType: hard
+"picocolors@npm:^1.0.1":
+ version: 1.1.0
+ resolution: "picocolors@npm:1.1.0"
+ checksum: a2ad60d94d185c30f2a140b19c512547713fb89b920d32cc6cf658fa786d63a37ba7b8451872c3d9fc34883971fb6e5878e07a20b60506e0bb2554dce9169ccb
+ languageName: node
+ linkType: hard
+
"picomatch@npm:^2.0.4, picomatch@npm:^2.2.3":
version: 2.3.1
resolution: "picomatch@npm:2.3.1"
@@ -12931,6 +13365,7 @@ __metadata:
"@types/react": "npm:^18.2.15"
"@types/react-native": "npm:^0.66.16"
"@types/react-test-renderer": "npm:^18.0.7"
+ "@typescript-eslint/typescript-estree": "npm:^8.4.0"
babel-plugin-module-resolver: "npm:^4.1.0"
commitlint: "npm:^11.0.0"
cz-conventional-changelog: "npm:^3.3.0"
@@ -12949,10 +13384,10 @@ __metadata:
react-native: "npm:0.72.3"
react-native-builder-bob: "npm:^0.18.1"
react-native-gesture-handler: "npm:~2.12.0"
- react-native-reanimated: "npm:~3.3.0"
+ react-native-reanimated: "npm:^3.15.1"
react-test-renderer: "npm:^18.2.0"
sponsorkit: "npm:^0.1.3"
- typescript: "npm:^4.0.8"
+ typescript: "npm:^5.5.4"
watch: "npm:^1.0.2"
peerDependencies:
"@types/react": "*"
@@ -12969,24 +13404,26 @@ __metadata:
languageName: unknown
linkType: soft
-"react-native-reanimated@npm:~3.3.0":
- version: 3.3.0
- resolution: "react-native-reanimated@npm:3.3.0"
- dependencies:
- "@babel/plugin-transform-object-assign": "npm:^7.16.7"
+"react-native-reanimated@npm:^3.15.1":
+ version: 3.15.1
+ resolution: "react-native-reanimated@npm:3.15.1"
+ dependencies:
+ "@babel/plugin-transform-arrow-functions": "npm:^7.0.0-0"
+ "@babel/plugin-transform-class-properties": "npm:^7.0.0-0"
+ "@babel/plugin-transform-classes": "npm:^7.0.0-0"
+ "@babel/plugin-transform-nullish-coalescing-operator": "npm:^7.0.0-0"
+ "@babel/plugin-transform-optional-chaining": "npm:^7.0.0-0"
+ "@babel/plugin-transform-shorthand-properties": "npm:^7.0.0-0"
+ "@babel/plugin-transform-template-literals": "npm:^7.0.0-0"
+ "@babel/plugin-transform-unicode-regex": "npm:^7.0.0-0"
"@babel/preset-typescript": "npm:^7.16.7"
convert-source-map: "npm:^2.0.0"
invariant: "npm:^2.2.4"
peerDependencies:
"@babel/core": ^7.0.0-0
- "@babel/plugin-proposal-nullish-coalescing-operator": ^7.0.0-0
- "@babel/plugin-proposal-optional-chaining": ^7.0.0-0
- "@babel/plugin-transform-arrow-functions": ^7.0.0-0
- "@babel/plugin-transform-shorthand-properties": ^7.0.0-0
- "@babel/plugin-transform-template-literals": ^7.0.0-0
react: "*"
react-native: "*"
- checksum: 44496b834461dc6968f9add6a318d4ebc40c0989021fd4fab78832cef9507873cb7b9737ad2f7d9c8ac072b84870bfbddd2c27b94de4024d9103017388d7e3ed
+ checksum: 8310e0cfa63bfd16eda19437599388ed92fc8c3031be62270894290e63f4b353474e0b94cef67c676d26cea82353e6c4a6e03c4bf11e3532dc26e8b5881ec5fc
languageName: node
linkType: hard
@@ -13812,6 +14249,15 @@ __metadata:
languageName: node
linkType: hard
+"semver@npm:^7.6.0":
+ version: 7.6.3
+ resolution: "semver@npm:7.6.3"
+ bin:
+ semver: bin/semver.js
+ checksum: 36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10
+ languageName: node
+ linkType: hard
+
"send@npm:0.17.2":
version: 0.17.2
resolution: "send@npm:0.17.2"
@@ -14809,6 +15255,15 @@ __metadata:
languageName: node
linkType: hard
+"ts-api-utils@npm:^1.3.0":
+ version: 1.3.0
+ resolution: "ts-api-utils@npm:1.3.0"
+ peerDependencies:
+ typescript: ">=4.2.0"
+ checksum: 3ee44faa24410cd649b5c864e068d438aa437ef64e9e4a66a41646a6d3024d3097a695eeb3fb26ee364705d3cb9653a65756d009e6a53badb6066a5f447bf7ed
+ languageName: node
+ linkType: hard
+
"tsconfig-paths@npm:^3.14.1":
version: 3.14.1
resolution: "tsconfig-paths@npm:3.14.1"
@@ -14975,23 +15430,23 @@ __metadata:
languageName: node
linkType: hard
-"typescript@npm:^4.0.8":
- version: 4.5.5
- resolution: "typescript@npm:4.5.5"
+"typescript@npm:^5.5.4":
+ version: 5.5.4
+ resolution: "typescript@npm:5.5.4"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 6b1a99a272bb6bf701e6f5f7e23455049a85db4958cd19bc4c2d25025b5af5751756962ae7a8bbcc1e339fa5209384f5e15352aa973c2121d7f8f525067106b3
+ checksum: 1689ccafef894825481fc3d856b4834ba3cc185a9c2878f3c76a9a1ef81af04194849840f3c69e7961e2312771471bb3b460ca92561e1d87599b26c37d0ffb6f
languageName: node
linkType: hard
-"typescript@patch:typescript@npm%3A^4.0.8#optional!builtin":
- version: 4.5.5
- resolution: "typescript@patch:typescript@npm%3A4.5.5#optional!builtin::version=4.5.5&hash=bcec9a"
+"typescript@patch:typescript@npm%3A^5.5.4#optional!builtin":
+ version: 5.5.4
+ resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=e012d7"
bin:
tsc: bin/tsc
tsserver: bin/tsserver
- checksum: 3875b1a307d4e01bcdb7537ba708b4c937dd6c89ef230391e9957983b642b0cd58f3355098fb717b7c97753f56d9cde0d3f817e5367d5b5c20f357be961b3c71
+ checksum: 2c065f0ef81855eac25c9b658a3c9da65ffc005260c12854c2286f40f3667e1b1ecf8bdbdd37b59aa0397920378ce7900bff8cb32e0f1c7af6fd86efc676718c
languageName: node
linkType: hard
@@ -15180,6 +15635,20 @@ __metadata:
languageName: node
linkType: hard
+"update-browserslist-db@npm:^1.1.0":
+ version: 1.1.0
+ resolution: "update-browserslist-db@npm:1.1.0"
+ dependencies:
+ escalade: "npm:^3.1.2"
+ picocolors: "npm:^1.0.1"
+ peerDependencies:
+ browserslist: ">= 4.21.0"
+ bin:
+ update-browserslist-db: cli.js
+ checksum: d70b9efeaf4601aadb1a4f6456a7a5d9118e0063d995866b8e0c5e0cf559482671dab6ce7b079f9536b06758a344fbd83f974b965211e1c6e8d1958540b0c24c
+ languageName: node
+ linkType: hard
+
"uri-js@npm:^4.2.2":
version: 4.4.1
resolution: "uri-js@npm:4.4.1"