diff --git a/.github/workflows/boilerplate-checks.yml b/.github/workflows/boilerplate-checks.yml index 5d84af9e..8cbef23f 100644 --- a/.github/workflows/boilerplate-checks.yml +++ b/.github/workflows/boilerplate-checks.yml @@ -24,7 +24,7 @@ jobs: with: working_directory: ./template - name: Run Eslint - run: yarn lint:coventions + run: yarn lint:rules working-directory: ./template - name: Run Prettier run: yarn lint:code-format diff --git a/documentation/docs/03-Project Structure.md b/documentation/docs/03-Project Structure.md index ea30654a..bf38f375 100644 --- a/documentation/docs/03-Project Structure.md +++ b/documentation/docs/03-Project Structure.md @@ -16,7 +16,7 @@ To achieve this, the project structure is thoughtfully organized into distinct s |--------------------|-------------------------------------------------------------------------------------------------------------------| | `src/components` | Home to application components, following the atomic design methodology for organizing presentational components. | | `src/hooks` | Custom hooks used throughout the application. | -| `src/navigations` | Navigator components responsible for handling navigation. | +| `src/navigation` | Navigator components responsible for handling navigation. | | `src/screens` | Screen components representing various app screens. | | `src/services` ️ | Houses data fetching and related services. | | `src/theme` | Holds theme configuration for the application. | diff --git a/documentation/docs/04-Guides/01-Navigate.md b/documentation/docs/04-Guides/01-Navigate.md index fb1e0322..870d65bd 100644 --- a/documentation/docs/04-Guides/01-Navigate.md +++ b/documentation/docs/04-Guides/01-Navigate.md @@ -13,7 +13,7 @@ any new features and improvements. ## Navigation structure -All navigation-related configurations and navigators are neatly organized within the `src/navigations` folder. Here's a brief overview: +All navigation-related configurations and navigators are neatly organized within the `src/navigation` folder. Here's a brief overview: ### Root file (`Application.{js, tsx}`) @@ -34,7 +34,7 @@ You can either add your own navigators or, if you prefer, replace the existing s ## Using typescript It's crucial not to overlook the creation of types for your navigation parameters. This practice helps prevent errors and enhances autocompletion. -You can define these types in the `@/navigations/types.ts` file. +You can define these types in the `@/navigation/types.ts` file. For more in-depth information on this topic, please refer to the [React Navigation documentation](https://reactnavigation.org/docs/typescript/). diff --git a/documentation/docs/04-Guides/08 - Components/01 - AssetByVariant.md b/documentation/docs/04-Guides/08 - Components/01 - AssetByVariant.md new file mode 100644 index 00000000..478fd8f3 --- /dev/null +++ b/documentation/docs/04-Guides/08 - Components/01 - AssetByVariant.md @@ -0,0 +1,41 @@ +--- +slug: /components/asset-by-variant +sidebar_label: AssetByVariant +title: AssetByVariant +id: asset-by-variant +keywords: [asset, variant, assetbyvariant, asset-by-variant, component] +--- + +The atomic `AssetByVariant` component is a helper component that allows you to render different assets based on the current [variant](/docs/theming/configuration#variants) of your app. This component is particularly useful when you need to display different images or assets based on the variant of your app. If the asset is not found for the current variant, the component will render the default asset. + +### Usage + +You will need to store your assets in the `theme/assets/images` folder. The `AssetByVariant` component will try to find the asset in the `theme/assets/images/` folder, falling back to the default asset located in the `theme/assets/images` folder. +So if you have an asset named `tom` in the `theme/assets/images/premiums` folder, the component will try to find the asset in the `theme/assets/images/premiums` folder, falling back to the default asset located in the `theme/assets/images` folder. + +```jsx +import { AssetByVariant } from '@/components/atoms'; + +function Example() { + return ( + + ); +} +``` + +:::info +the `path` prop can handle a path with sub folders, for example, `folder1/folder2/assetName`. The component will try to find the asset in the `theme/assets/images//folder1/folder2` folder, falling back to the default asset located in the `theme/assets/images/folder1/folder2` folder. +::: + + +### Props + +| Name | Type | Default | Description | +|------------|----------------------------|---------|-----------------------------------------------------------------------------------------------| +| path | string | | The required path of the asset to be displayed. The component will try to find the asset in the `theme/assets/images/` folder, falling back to the default asset located in the `theme/assets/images` folder. | +| extension | string | 'png' | The extension of the asset to be displayed. | +| ...props | Omit\ | | all props from `Image` component are supported except `source` prop. | diff --git a/documentation/docs/04-Guides/08 - Components/02 - IconByVariant.md b/documentation/docs/04-Guides/08 - Components/02 - IconByVariant.md new file mode 100644 index 00000000..7601e9dc --- /dev/null +++ b/documentation/docs/04-Guides/08 - Components/02 - IconByVariant.md @@ -0,0 +1,41 @@ +--- +slug: /components/icon-by-variant +sidebar_label: IconByVariant +title: IconByVariant +id: icon-by-variant +keywords: [icon, variant, iconbyvariant, icon-by-variant, component] +--- + +The atomic `IconByVariant` component is a helper component that allows you to render different icons based on the current [variant](/docs/theming/configuration#variants) of your app. This component is particularly useful when you need to display different icon based on the variant of your app. If the icon is not found for the current variant, the component will render the default icon. + +### Usage +You will need to store your icons in the `theme/assets/icons` folder. The `IconByVariant` component will try to find the icon in the `theme/assets/icons/` folder, falling back to the default icon located in the `theme/assets/icons` folder. +So if you have an icon named `language` in the `theme/assets/icons/premiums` folder, the component will try to find the icon in the `theme/assets/icons/premiums` folder, falling back to the default icon located in the `theme/assets/icons` folder. + +```jsx +import { IconByVariant } from '@/components/atoms'; + +function Example() { + return ( + ` folder, fallback to the default asset located in `theme/assets/icons` folder + /> + ); +} + +``` + +:::info +the `path` prop can handle a path with sub folders, for example, `folder1/folder2/iconName`. The component will try to find the asset in the `theme/assets/icons//folder1/folder2` folder, falling back to the default asset located in the `theme/assets/icons/folder1/folder2` folder. +::: + +### Props + +| Name | Type | Default | Description | +|------------|--------|---------|-----------------------------------------------------------------------------------------------| +| path | string | | The required name of the asset to be displayed. The component will try to find the asset in the `theme/assets/icons/` folder, falling back to the default asset located in the `theme/assets/icons` folder. | +| ...props | SvgProps | | all props from `Svg` component are supported except `source` prop. | + +:::info +The `IconByVariant` component use the `Svg` component from [`react-native-svg` library](https://github.com/software-mansion/react-native-svg) to render the icon. You can find more information about the `Svg` component in the react-native-svg documentation. +::: \ No newline at end of file diff --git a/documentation/docs/04-Guides/08 - Components/03 - Skeleton.md b/documentation/docs/04-Guides/08 - Components/03 - Skeleton.md new file mode 100644 index 00000000..2885ac74 --- /dev/null +++ b/documentation/docs/04-Guides/08 - Components/03 - Skeleton.md @@ -0,0 +1,42 @@ +--- +slug: /components/skeleton +sidebar_label: Skeleton +title: Skeleton +id: skeleton +keywords: [skeleton, loading, animation] +--- + +The atomic `Skeleton` component is a helper component that allows you to display a loading animation while the content is loading. This component is particularly useful when you need to display a loading animation while the content is loading by presenting a placeholder UI of all the components to the user. + +### Usage + +```jsx +import { AssetByVariant, IconByVariant, Skeleton } from '@/components/atoms'; + +function Example() { + const fetchOneUserQuery = useFetchOneQuery(currentId); // fetchOneUserQuery is a react-query query + + return ( + + {user.name} + + ); +} + +export default Example; + +``` + +So the user name will be displayed when the `fetchOneUserQuery` is not loading, otherwise, the `Skeleton` component will display a loading animation. + +### Props + +| Name | Type | Default | Description | +|------------|--------|---------|-----------------------------------------------------------------------------------------------| +| loading | boolean | | The required boolean value to determine whether the content is loading or not. | +| children | ReactNode | | The required children to be displayed. | +| height | DimensionValue | 24 | The duration of the loading animation in milliseconds. | +| width | DimensionValue | '100%' | The duration of the loading animation in milliseconds. | +| ...props | ViewProps | | all props from `View` component are supported. | \ No newline at end of file diff --git a/documentation/docs/04-Guides/08 - Components/04 - DefaultError.md b/documentation/docs/04-Guides/08 - Components/04 - DefaultError.md new file mode 100644 index 00000000..fd2a254e --- /dev/null +++ b/documentation/docs/04-Guides/08 - Components/04 - DefaultError.md @@ -0,0 +1,16 @@ +--- +slug: /components/default-error +sidebar_label: DefaultError +title: DefaultError +id: default-error +keywords: [DefaultError, Error, boundary] +--- + +The molecule `DefaultError` component is used into the [`ErrorBoundary` component](/docs/components/error-boundary) as the default error UI. +This component is composed of `Text` components and a `Button` to reset the error (for re-executing the query for example). + +### Props + +| Name | Type | Default | Description | +|------------|--------|---------|-----------------------------------------------------------------------------------------------| +| onReset | function | | The required function to reset the error. | \ No newline at end of file diff --git a/documentation/docs/04-Guides/08 - Components/05 - ErrorBoundary.md b/documentation/docs/04-Guides/08 - Components/05 - ErrorBoundary.md new file mode 100644 index 00000000..6e9ac4e0 --- /dev/null +++ b/documentation/docs/04-Guides/08 - Components/05 - ErrorBoundary.md @@ -0,0 +1,43 @@ +--- +slug: /components/error-boundary +sidebar_label: ErrorBoundary +title: ErrorBoundary +id: error-boundary +keywords: [ErrorBoundary, Error, boundary] +--- + +The organism `ErrorBoundary` component is a helper component that allows you to catch JavaScript errors anywhere in the component tree and log those errors. This component is particularly useful when you need to catch errors in your app and display a fallback UI to the user. + +### Usage + +```jsx +import { ErrorBoundary } from "@/components/atoms"; + +Something went wrong}> + + +``` + +### Log errors +In the `ErrorBoundary` component, you will find a `onErrorReport` function that allows you to log the error in your application. You can use any logging library to log the error like `sentry`, `logrocket`, `crashlytics`, etc. + +```jsx +const onErrorReport = (error: Error, info: ErrorInfo) => { + // use any crash reporting tool here + return onError?.(error, info); +}; +``` + +### Props + +As the `ErrorBoundary` component is a wrapper component, it accepts all the props from the [`react-error-boundary`](https://github.com/bvaughn/react-error-boundary) library with fallback props except that the `fallback` prop is empty by default. + +| Name | Type | Default | Description | +|------------|--------|---------|-----------------------------------------------------------------------------------------------| +| fallback | ReactNode | | The required fallback UI to be displayed when an error occurs. | +| onReset | function | | The optional function to reset the error state | +| ...props | any | | all props from `ErrorBoundary` component are supported. | + + +:::info +This component is used in the `SafeScreen` component to catch JavaScript errors and display a fallback UI to the user. \ No newline at end of file diff --git a/documentation/docs/04-Guides/08 - Components/06 - SafeScreen.md b/documentation/docs/04-Guides/08 - Components/06 - SafeScreen.md new file mode 100644 index 00000000..3b9bea42 --- /dev/null +++ b/documentation/docs/04-Guides/08 - Components/06 - SafeScreen.md @@ -0,0 +1,42 @@ +--- +slug: /components/safe-screen +sidebar_label: SafeScreen +title: SafeScreen +id: safe-screen +keywords: [SafeScreen, StatusBar, SafeAreaView, ErrorBoundary, DefaultError] +--- + +The template `SafeScreen` component is a helper component that allows you to display a screen with a safe area view, a status bar, and a fallback UI when an error occurs in the application. This component is particularly useful when you need to display a screen with all necessary tools to handle errors in your app. + +### Usage + +```jsx +import { useI18n, useUser } from '@/hooks'; + +import { SafeScreen } from '@/components/templates'; + +function Example() { + const { useFetchOneQuery } = useUser(); + + const fetchOneUserQuery = useFetchOneQuery(1); + + return ( + + // your content here + + ); +} +``` + +So if an error occurs in the `fetchOneUserQuery`, the `SafeScreen` component will display the [`DefaultError` component](/docs/components/default-error) with a button to reset the error. It also display the same error for any other error in the screen thanks to the [error boundary system](/docs/components/error-boundary). + +### Props + +| Name | Type | Default | Description | +|--------------|----------|---------|-----------------------------------------------------------------------------------------------| +| isError | boolean | | boolean value to determine whether an error occurred or not. | +| onResetError | function | | function called on default error button press | +| ...props | Omit\ | | all props from `View` component are supported. | \ No newline at end of file diff --git a/package.json b/package.json index 44f19474..46c389e0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@thecodingmachine/react-native-boilerplate", - "version": "4.3.3", + "version": "4.4.4", "description": "TheCodingMachine React Native Boilerplate", "repository": { "type": "git", diff --git a/template/.eslintrc.js b/template/.eslintrc.js deleted file mode 100644 index a09c1e20..00000000 --- a/template/.eslintrc.js +++ /dev/null @@ -1,128 +0,0 @@ -module.exports = { - env: { - 'jest/globals': true, - }, - extends: [ - '@react-native', - 'eslint:recommended', - 'plugin:@typescript-eslint/recommended', - 'plugin:@typescript-eslint/strict', - 'plugin:import/errors', - 'plugin:import/typescript', - 'plugin:react-hooks/recommended', - 'plugin:react/recommended', - ], - plugins: [ - '@typescript-eslint', - 'import', - 'react-hooks', - 'react', - 'typescript-sort-keys', - 'unicorn', - 'unused-imports', - ], - ignorePatterns: ['plugins/**/*', 'metro.config.js'], - overrides: [ - { - files: ['./**/*.test.{ts,tsx}'], - // in test files we allow anys and more ergonomic code. - rules: { - '@typescript-eslint/no-unsafe-assignment': 'off', - '@typescript-eslint/no-unsafe-call': 'off', - '@typescript-eslint/no-unsafe-member-access': 'off', - '@typescript-eslint/no-unsafe-return': 'off', - }, - }, - ], - parser: '@typescript-eslint/parser', - parserOptions: { - ecmaVersion: 'latest', - project: ['./tsconfig.json'], - sourceType: 'module', - tsconfigRootDir: __dirname, - }, - rules: { - '@typescript-eslint/consistent-type-imports': 'error', - 'import/no-unresolved': 0, // tsc resolves it, no need for eslint - 'unicorn/prefer-top-level-await': 0, // not valid on RN for the moment - '@typescript-eslint/ban-ts-comment': 0, - '@typescript-eslint/no-dynamic-delete': 0, - '@typescript-eslint/no-invalid-void-type': 0, - '@typescript-eslint/no-namespace': 0, - '@typescript-eslint/no-non-null-assertion': 0, - '@typescript-eslint/no-this-alias': 0, - '@typescript-eslint/no-unused-vars': 0, - '@typescript-eslint/no-var-requires': 0, - curly: 2, - // `import/default`, `import/namespace` and `import/no-duplicates` are slow. - 'import/default': 0, - 'import/named': 0, - 'import/namespace': 0, - 'import/no-duplicates': 0, - 'import/no-extraneous-dependencies': 2, - 'import/no-named-as-default-member': 0, - //'import/no-namespace': 2, - 'import/order': 0, - 'no-console': 2, - 'no-const-assign': 2, - 'no-constant-binary-expression': 2, - 'no-extra-parens': [2, 'functions'], - 'no-irregular-whitespace': 2, - 'no-this-before-super': 2, - 'no-unused-expressions': 2, - 'no-unused-labels': 2, - 'no-unused-vars': 0, - 'no-useless-rename': 2, - 'no-var': 2, - 'no-warning-comments': [2, { terms: ['@nocommit'] }], - 'object-curly-spacing': 0, - 'object-shorthand': 2, - 'prefer-arrow-callback': [2, { allowNamedFunctions: true }], - 'prefer-const': 2, - 'react-hooks/exhaustive-deps': 2, - 'react/jsx-sort-props': 2, - 'react/prop-types': 0, - 'react/react-in-jsx-scope': 0, - 'typescript-sort-keys/interface': 2, - 'typescript-sort-keys/string-enum': 2, - 'unicorn/better-regex': 2, - 'unicorn/catch-error-name': 2, - 'unicorn/consistent-empty-array-spread': 2, - 'unicorn/consistent-function-scoping': 2, - 'unicorn/no-abusive-eslint-disable': 2, - 'unicorn/no-hex-escape': 2, - 'unicorn/no-invalid-fetch-options': 2, - 'unicorn/no-length-as-slice-end': 2, - 'unicorn/no-magic-array-flat-depth': 2, - 'unicorn/no-typeof-undefined': 2, - 'unicorn/no-unnecessary-polyfills': 2, - 'unicorn/no-useless-promise-resolve-reject': 2, - 'unicorn/no-useless-spread': 2, - 'unicorn/numeric-separators-style': 2, - 'unicorn/prefer-array-flat-map': 2, - 'unicorn/prefer-array-index-of': 2, - 'unicorn/prefer-array-some': 2, - 'unicorn/prefer-at': 2, - 'unicorn/prefer-dom-node-append': 2, - 'unicorn/prefer-native-coercion-functions': 2, - 'unicorn/prefer-node-protocol': 2, - 'unicorn/prefer-number-properties': 2, - 'unicorn/prefer-optional-catch-binding': 2, - 'unicorn/prefer-set-size': 2, - 'unicorn/prefer-string-raw': 2, - 'unicorn/prefer-string-replace-all': 2, - 'unicorn/prefer-string-slice': 2, - 'unicorn/prefer-structured-clone': 2, - 'unicorn/prefer-ternary': 2, - 'unicorn/text-encoding-identifier-case': 2, - 'unused-imports/no-unused-imports': 2, - }, - settings: { - 'import/parsers': { - '@typescript-eslint/parser': ['.ts', '.tsx'], - }, - react: { - version: '18', - }, - }, -}; diff --git a/template/.prettierrc.js b/template/.prettierrc.js index c82bd6f5..2c620c33 100644 --- a/template/.prettierrc.js +++ b/template/.prettierrc.js @@ -11,7 +11,7 @@ module.exports = { '', // empty line '^@/theme(.*)$', '^@/hooks(.*)$', - '^@/navigations(.*)$', + '^@/navigation(.*)$', '^@/translations(.*)$', '', // empty line '^@/components/atoms(.*)$', diff --git a/template/eslint.config.mjs b/template/eslint.config.mjs new file mode 100644 index 00000000..83e48348 --- /dev/null +++ b/template/eslint.config.mjs @@ -0,0 +1,147 @@ +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; +import importPlugin from 'eslint-plugin-import'; +import jest from 'eslint-plugin-jest'; +import react from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; +import typescriptSortKeys from 'eslint-plugin-typescript-sort-keys'; +import unicorn from 'eslint-plugin-unicorn'; +import unusedImports from 'eslint-plugin-unused-imports'; +import tsEslint from 'typescript-eslint'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +export default [ + ...tsEslint.configs.strict, + { + files: ['**/*.js', '**/*.jsx', '**/*.ts', '**/*.tsx'], + plugins: { + import: importPlugin, + react, + 'react-hooks': reactHooks, + unicorn, + 'unused-imports': unusedImports, + jest, + }, + rules: { + 'import/no-unresolved': 0, // handled by TypeScript + 'unicorn/prefer-top-level-await': 0, // not valid on RN for the moment + curly: 2, + // `import/default`, `import/namespace` and `import/no-duplicates` are slow. + 'import/default': 0, + 'import/named': 0, + 'import/namespace': 0, + 'import/no-duplicates': 0, + 'import/no-extraneous-dependencies': 2, + 'import/no-named-as-default-member': 0, + 'import/order': 0, + 'no-const-assign': 2, + 'no-constant-binary-expression': 2, + 'no-extra-parens': [2, 'functions'], + 'no-irregular-whitespace': 2, + 'no-this-before-super': 2, + 'no-unused-expressions': 2, + 'no-unused-labels': 2, + 'no-unused-vars': 0, + 'no-useless-rename': 2, + 'no-var': 2, + 'no-console': 2, + 'no-warning-comments': [2, { terms: ['@nocommit'] }], + 'object-curly-spacing': 0, + 'object-shorthand': 2, + 'prefer-arrow-callback': [2, { allowNamedFunctions: true }], + 'prefer-const': 2, + 'react-hooks/exhaustive-deps': 2, + 'react/jsx-sort-props': 2, + 'react/prop-types': 2, + 'react/react-in-jsx-scope': 0, + 'react/require-default-props': [ + 2, + { + forbidDefaultForRequired: true, + functions: 'defaultArguments', + }, + ], + 'unicorn/better-regex': 2, + 'unicorn/catch-error-name': 2, + 'unicorn/consistent-empty-array-spread': 2, + 'unicorn/consistent-function-scoping': 2, + 'unicorn/no-abusive-eslint-disable': 2, + 'unicorn/no-hex-escape': 2, + 'unicorn/no-invalid-fetch-options': 2, + 'unicorn/no-length-as-slice-end': 2, + 'unicorn/no-magic-array-flat-depth': 2, + 'unicorn/no-typeof-undefined': 2, + 'unicorn/no-unnecessary-polyfills': 2, + 'unicorn/no-useless-promise-resolve-reject': 2, + 'unicorn/no-useless-spread': 2, + 'unicorn/numeric-separators-style': 2, + 'unicorn/prefer-array-flat-map': 2, + 'unicorn/prefer-array-index-of': 2, + 'unicorn/prefer-array-some': 2, + 'unicorn/prefer-at': 2, + 'unicorn/prefer-dom-node-append': 2, + 'unicorn/prefer-native-coercion-functions': 2, + 'unicorn/prefer-node-protocol': 2, + 'unicorn/prefer-number-properties': 2, + 'unicorn/prefer-optional-catch-binding': 2, + 'unicorn/prefer-set-size': 2, + 'unicorn/prefer-string-raw': 2, + 'unicorn/prefer-string-replace-all': 2, + 'unicorn/prefer-string-slice': 2, + 'unicorn/prefer-structured-clone': 2, + 'unicorn/prefer-ternary': 2, + 'unicorn/text-encoding-identifier-case': 2, + 'unused-imports/no-unused-imports': 0, + }, + settings: { + react: { + version: 'detect', + }, + }, + }, + { + files: ['**/*.ts', '**/*.tsx'], + languageOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + parser: tsEslint.parser, + parserOptions: { + project: ['./tsconfig.json'], + tsconfigRootDir: __dirname, + }, + }, + plugins: { + '@typescript-eslint': tsEslint.plugin, + 'typescript-sort-keys': typescriptSortKeys, + }, + rules: { + 'import/no-unresolved': 0, // handled by TypeScript + '@typescript-eslint/consistent-type-imports': 2, + '@typescript-eslint/ban-ts-comment': 0, + '@typescript-eslint/no-dynamic-delete': 0, + '@typescript-eslint/no-invalid-void-type': 0, + '@typescript-eslint/no-namespace': 0, + '@typescript-eslint/no-non-null-assertion': 0, + '@typescript-eslint/no-this-alias': 0, + '@typescript-eslint/no-unused-vars': 0, + '@typescript-eslint/no-var-requires': 0, + 'react/prop-types': 0, + 'typescript-sort-keys/interface': 2, + 'typescript-sort-keys/string-enum': 2, + }, + }, + { + files: ['./**/*.test.{ts,tsx}'], + rules: { + '@typescript-eslint/no-unsafe-assignment': 0, + '@typescript-eslint/no-unsafe-call': 0, + '@typescript-eslint/no-unsafe-member-access': 0, + '@typescript-eslint/no-unsafe-return': 0, + }, + }, + { + ignores: ['metro.config.js'], + }, +]; diff --git a/template/ios/Podfile.lock b/template/ios/Podfile.lock index 465d29e2..2b1f5aab 100644 --- a/template/ios/Podfile.lock +++ b/template/ios/Podfile.lock @@ -7,9 +7,9 @@ PODS: - hermes-engine (0.75.4): - hermes-engine/Pre-built (= 0.75.4) - hermes-engine/Pre-built (0.75.4) - - MMKV (1.3.3): - - MMKVCore (~> 1.3.3) - - MMKVCore (1.3.3) + - MMKV (1.3.9): + - MMKVCore (~> 1.3.9) + - MMKVCore (1.3.9) - RCT-Folly (2024.01.01.00): - boost - DoubleConversion @@ -1612,7 +1612,7 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNScreens (3.31.1): + - RNScreens (3.34.0): - DoubleConversion - glog - hermes-engine @@ -1866,8 +1866,8 @@ SPEC CHECKSUMS: fmt: 4c2741a687cc09f0634a2e2c72a838b99f1ff120 glog: 69ef571f3de08433d766d614c73a9838a06bf7eb hermes-engine: ea92f60f37dba025e293cbe4b4a548fd26b610a0 - MMKV: f902fb6719da13c2ab0965233d8963a59416f911 - MMKVCore: d26e4d3edd5cb8588c2569222cbd8be4231374e9 + MMKV: 817ba1eea17421547e01e087285606eb270a8dcb + MMKVCore: af055b00e27d88cd92fad301c5fecd1ff9b26dd9 RCT-Folly: 4464f4d875961fce86008d45f4ecf6cef6de0740 RCTDeprecation: 726d24248aeab6d7180dac71a936bbca6a994ed1 RCTRequired: a94e7febda6db0345d207e854323c37e3a31d93b @@ -1928,7 +1928,7 @@ SPEC CHECKSUMS: RNCMaskedView: 090213d32d8b3bb83a4dcb7d12c18f0152591906 RNGestureHandler: 6dfe7692a191ee224748964127114edf057a1475 RNReanimated: 6e79f3e3b37a88cddfb38525e9652aabd7c4c750 - RNScreens: a95afe7f9c615d654878777aeb240055e6cf66dd + RNScreens: 19719a9c326e925498ac3b2d35c4e50fe87afc06 RNSVG: 4590aa95758149fa27c5c83e54a6a466349a1688 SocketRocket: abac6f5de4d4d62d24e11868d7a2f427e0ef940d Yoga: 055f92ad73f8c8600a93f0e25ac0b2344c3b07e6 diff --git a/template/package.json b/template/package.json index 3709aeab..b8e33e88 100644 --- a/template/package.json +++ b/template/package.json @@ -7,32 +7,32 @@ "ios": "react-native run-ios", "start": "react-native start", "test": "jest", - "lint:coventions": "eslint . --cache", + "lint:rules": "eslint . --cache", "lint:code-format": "prettier --check \"{src,__mocks__}/**/*.{js,json,md,ts,tsx,yml,yaml}\"", "lint:type-check": "tsc", - "lint": "yarn lint:coventions && yarn lint:code-format && yarn lint:type-check", - "lint:fix": "yarn lint:coventions --fix && yarn lint:code-format --write && yarn lint:type-check", + "lint": "yarn lint:rules && yarn lint:code-format && yarn lint:type-check", + "lint:fix": "yarn lint:rules --fix && yarn lint:code-format --write && yarn lint:type-check", "test:report": "jest --collectCoverage --coverageDirectory=\"./coverage\" --ci --reporters=default --reporters=jest-junit --coverage", "pod-install": "npx pod-install", "postinstall": "npx patch-package" }, "dependencies": { "@react-native-masked-view/masked-view": "^0.3.1", - "@react-navigation/native": "^6.1.17", - "@react-navigation/stack": "^6.3.29", - "@tanstack/react-query": "^5.31.0", - "i18next": "^23.11.2", + "@react-navigation/native": "^6.1.18", + "@react-navigation/stack": "^6.4.1", + "@tanstack/react-query": "^5.59.8", + "i18next": "^23.15.2", "intl-pluralrules": "^2.0.1", - "ky": "^1.2.4", + "ky": "^1.7.2", "react": "18.3.1", "react-error-boundary": "^4.0.13", - "react-i18next": "^14.1.0", + "react-i18next": "^15.0.2", "react-native": "0.75.4", - "react-native-gesture-handler": "^2.16.0", + "react-native-gesture-handler": "^2.20.0", "react-native-mmkv": "^2.12.2", - "react-native-reanimated": "^3.9.0-rc.1", - "react-native-safe-area-context": "^4.10.1", - "react-native-screens": "3.31.1", + "react-native-reanimated": "^3.15.4", + "react-native-safe-area-context": "^4.11.0", + "react-native-screens": "3.34.0", "react-native-svg": "^15.7.1", "zod": "^3.23.8" }, @@ -51,30 +51,29 @@ "@types/node": "^18.14.1", "@types/react": "^18.2.6", "@types/react-test-renderer": "^18.0.0", - "@typescript-eslint/eslint-plugin": "7.1.1", - "@typescript-eslint/parser": "^7.1.1", "babel-jest": "^29.6.3", "babel-plugin-inline-dotenv": "^1.7.0", "babel-plugin-module-resolver": "^5.0.0", "babel-plugin-root-import": "^6.6.0", "dotenv": "^16.3.1", - "eslint": "^8.57.1", - "eslint-import-resolver-typescript": "^3.6.3", - "eslint-plugin-import": "^2.30.0", + "eslint": "^9.12.0", + "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.8.3", "eslint-plugin-no-instanceof": "^1.0.1", - "eslint-plugin-react-hooks": "^4.6.2", - "eslint-plugin-typescript-sort-keys": "^3.2.0", - "eslint-plugin-unicorn": "^55.0.0", + "eslint-plugin-react": "^7.37.1", + "eslint-plugin-react-hooks": "^5.1.0-rc-70fb1363-20241010", + "eslint-plugin-typescript-sort-keys": "^3.3.0", + "eslint-plugin-unicorn": "^56.0.0", "eslint-plugin-unused-imports": "^4.1.4", - "jest": "^29.6.3", + "jest": "^29.7.0", "prettier": "^3.3.3", "react-native-svg-transformer": "^1.5.0", "react-test-renderer": "18.3.1", - "reactotron-react-native": "^5.1.6", - "reactotron-react-native-mmkv": "^0.2.6", + "reactotron-react-native": "^5.1.9", + "reactotron-react-native-mmkv": "^0.2.7", "reactotron-react-query": "^1.0.4", - "typescript": "5.1.3" + "typescript": "5.6.3", + "typescript-eslint": "^8.8.1" }, "engines": { "node": ">=18" diff --git a/template/plugins/compile-js/index.js b/template/plugins/compile-js/index.js index 77cdfabd..afd59468 100644 --- a/template/plugins/compile-js/index.js +++ b/template/plugins/compile-js/index.js @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-require-imports */ const promptsOptions = require('./_prompts'); const { apply } = require('./plugin'); diff --git a/template/plugins/compile-js/plugin.js b/template/plugins/compile-js/plugin.js index ad54c7e5..8643ab6f 100644 --- a/template/plugins/compile-js/plugin.js +++ b/template/plugins/compile-js/plugin.js @@ -1,6 +1,8 @@ -const { execSync } = require('child_process'); +/* eslint-disable @typescript-eslint/no-require-imports */ +/* eslint-disable no-console */ +const { execSync, spawnSync } = require('node:child_process'); -const TYPESCRIPT_VERSION = '5.6.2'; +const TYPESCRIPT_VERSION = '5.6.3'; function isYarnAvailable() { try { @@ -9,7 +11,7 @@ function isYarnAvailable() { stdio: [0, 'pipe', 'ignore'], }).toString() || '' ).trim(); - } catch (error) { + } catch { return null; } } @@ -20,21 +22,24 @@ function isNpmAvailable() { stdio: [0, 'pipe', 'ignore'], }).toString() || '' ).trim(); - } catch (error) { + } catch { return null; } } module.exports = { - async apply(value, previousValues) { + async apply(value) { return new Promise((resolve) => { let packageManager = null; + let addCmd = null; // react-native cli prefer yarn so we follow the same logic if (isYarnAvailable()) { packageManager = 'yarn'; + addCmd = 'add'; } else if (isNpmAvailable()) { packageManager = 'npm'; + addCmd = 'install'; } if (!packageManager) { @@ -48,12 +53,26 @@ module.exports = { console.log('\n'); console.log('📦 Loading the build tool...'); - execSync(`${packageManager} add -D typescript@${TYPESCRIPT_VERSION}`); + const installTypeScriptCmd = spawnSync( + packageManager, + [addCmd, '-D', `typescript@${TYPESCRIPT_VERSION}`], + { stdio: 'inherit' }, + ); + if (installTypeScriptCmd.error) { + console.error(installTypeScriptCmd.error); + process.exit(1); + } console.log('🧱 Building the javascript source...'); - execSync( - 'npx tsc --jsx react-native --module ESNext --outDir js --noEmit false --isolatedModules false --esModuleInterop true', + const transpileCmd = spawnSync( + 'npx', + ['tsc', '--project', `plugins/compile-js/tsconfig.build.json`], + { stdio: 'inherit' }, ); + if (transpileCmd.error) { + console.error(transpileCmd.error); + process.exit(1); + } try { console.log('🖼️ Copying assets...'); @@ -65,7 +84,7 @@ module.exports = { execSync('rm -rf __mocks__', { stdio: 'pipe' }); execSync('cp -R js/__mocks__ ./__mocks__', { stdio: 'pipe' }); execSync('rm -rf js', { stdio: 'pipe' }); - } catch (error) { + } catch { console.error( '🚨 Failed to copy assets or replace source. If you are using windows, please use git bash.', ); @@ -74,8 +93,8 @@ module.exports = { console.log('🌀 Removing types ...'); execSync('rm -rf src/theme/types', { stdio: 'pipe' }); - execSync('rm -f src/navigations/paths.js', { stdio: 'pipe' }); - execSync('rm -f src/navigations/types.js', { stdio: 'pipe' }); + execSync('rm -f src/navigation/paths.js', { stdio: 'pipe' }); + execSync('rm -f src/navigation/types.js', { stdio: 'pipe' }); } resolve(); diff --git a/template/plugins/compile-js/tsconfig.build.json b/template/plugins/compile-js/tsconfig.build.json new file mode 100644 index 00000000..ac4eb257 --- /dev/null +++ b/template/plugins/compile-js/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "jsx": "react-native", + "module": "ESNext", + "outDir": "../../js", + "noEmit": false, + "isolatedModules": false, + "esModuleInterop": true + } +} diff --git a/template/plugins/index.js b/template/plugins/index.js index e749eec4..c98009f1 100644 --- a/template/plugins/index.js +++ b/template/plugins/index.js @@ -1,3 +1,5 @@ +/* eslint-disable @typescript-eslint/no-require-imports */ +// eslint-disable-next-line import/no-extraneous-dependencies const prompts = require('prompts'); const typescriptPlugin = require('./compile-js'); const printSuccessPlugin = require('./printSuccess'); diff --git a/template/plugins/printSuccess/index.js b/template/plugins/printSuccess/index.js index 19773414..50131d9e 100644 --- a/template/plugins/printSuccess/index.js +++ b/template/plugins/printSuccess/index.js @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/no-require-imports */ const promptsOptions = require('./_prompts'); const { apply } = require('./plugin'); diff --git a/template/plugins/printSuccess/plugin.js b/template/plugins/printSuccess/plugin.js index fb5da7b8..8688f46d 100644 --- a/template/plugins/printSuccess/plugin.js +++ b/template/plugins/printSuccess/plugin.js @@ -1,3 +1,6 @@ +/* eslint-disable @typescript-eslint/no-require-imports */ +/* eslint-disable no-console */ +// eslint-disable-next-line import/no-extraneous-dependencies const { green, blue, yellow, red } = require('kleur'); module.exports = { diff --git a/template/src/App.tsx b/template/src/App.tsx index 1d37aaaf..9d381f8f 100644 --- a/template/src/App.tsx +++ b/template/src/App.tsx @@ -5,7 +5,7 @@ import { GestureHandlerRootView } from 'react-native-gesture-handler'; import { MMKV } from 'react-native-mmkv'; import { ThemeProvider } from '@/theme'; -import ApplicationNavigator from '@/navigations/Application'; +import ApplicationNavigator from '@/navigation/Application'; import '@/translations'; diff --git a/template/src/components/atoms/index.ts b/template/src/components/atoms/index.ts index 88dfff85..689b9d47 100644 --- a/template/src/components/atoms/index.ts +++ b/template/src/components/atoms/index.ts @@ -1,4 +1,3 @@ export { default as AssetByVariant } from './AssetByVariant/AssetByVariant'; -export { default as ErrorBoundary } from './ErrorBoundary/ErrorBoundary'; export { default as IconByVariant } from './IconByVariant/IconByVariant'; export { default as Skeleton } from './Skeleton/Skeleton'; diff --git a/template/src/components/molecules/Brand/Brand.test.tsx b/template/src/components/molecules/Brand/Brand.test.tsx deleted file mode 100644 index 5d339d6d..00000000 --- a/template/src/components/molecules/Brand/Brand.test.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import type { ViewStyle } from 'react-native'; - -import { render } from '@testing-library/react-native'; - -import TestAppWrapper from '@/../__mocks__/TestAppWrapper'; - -import Brand from './Brand'; - -describe('Brand component should render correctly', () => { - test('with default props if not precises (height: 200, width: 200, resizeMode: "contain")', () => { - const { getByTestId } = render(, { wrapper: TestAppWrapper }); - - const wrapper = getByTestId('brand-img-wrapper'); - const img = getByTestId('brand-img'); - - // Props set correctly - expect((wrapper.props.style as ViewStyle).height).toBe(200); - expect((wrapper.props.style as ViewStyle).width).toBe(200); - expect(img.props.resizeMode).toBe('contain'); - }); - - test('with passed props', () => { - const { getByTestId } = render( - , - { wrapper: TestAppWrapper }, - ); - - const wrapper = getByTestId('brand-img-wrapper'); - const img = getByTestId('brand-img'); - - expect((wrapper.props.style as ViewStyle).height).toBe(100); - expect((wrapper.props.style as ViewStyle).width).toBe(100); - expect(img.props.resizeMode).toBe('cover'); - }); -}); diff --git a/template/src/components/molecules/Brand/Brand.tsx b/template/src/components/molecules/Brand/Brand.tsx deleted file mode 100644 index 8c5223d6..00000000 --- a/template/src/components/molecules/Brand/Brand.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import type { ImageProps } from 'react-native'; - -import { View } from 'react-native'; - -import { useTheme } from '@/theme'; - -import { AssetByVariant } from '@/components/atoms'; - -function Brand({ - height = 200, - width = 200, - resizeMode = 'contain', -}: Pick) { - const { layout } = useTheme(); - - return ( - - - - ); -} - -export default Brand; diff --git a/template/src/components/molecules/DefaultError/DefaultError.tsx b/template/src/components/molecules/DefaultError/DefaultError.tsx index be39710a..3eca117d 100644 --- a/template/src/components/molecules/DefaultError/DefaultError.tsx +++ b/template/src/components/molecules/DefaultError/DefaultError.tsx @@ -10,7 +10,7 @@ type Props = { onReset?: () => void; }; -function DefaultErrorScreen({ onReset }: Props) { +function DefaultErrorScreen({ onReset = undefined }: Props) { const { gutters, layout, colors, fonts } = useTheme(); const { t } = useTranslation(); const { resetBoundary } = useErrorBoundary(); diff --git a/template/src/components/molecules/index.ts b/template/src/components/molecules/index.ts index cae1ae07..d6b1d0d8 100644 --- a/template/src/components/molecules/index.ts +++ b/template/src/components/molecules/index.ts @@ -1,2 +1 @@ -export { default as Brand } from './Brand/Brand'; export { default as DefaultError } from './DefaultError/DefaultError'; diff --git a/template/src/components/atoms/ErrorBoundary/ErrorBoundary.tsx b/template/src/components/organisms/ErrorBoundary/ErrorBoundary.tsx similarity index 60% rename from template/src/components/atoms/ErrorBoundary/ErrorBoundary.tsx rename to template/src/components/organisms/ErrorBoundary/ErrorBoundary.tsx index 04585bb8..bb12dabb 100644 --- a/template/src/components/atoms/ErrorBoundary/ErrorBoundary.tsx +++ b/template/src/components/organisms/ErrorBoundary/ErrorBoundary.tsx @@ -2,14 +2,22 @@ import type { ErrorInfo } from 'react'; import type { ErrorBoundaryPropsWithFallback } from 'react-error-boundary'; import { ErrorBoundary as DefaultErrorBoundary } from 'react-error-boundary'; -import { View } from 'react-native'; + +import { DefaultError } from '@/components/molecules'; type Optional = Pick, K> & Omit; -type Props = Optional; +type Props = Optional & { + onReset?: () => void; +}; -function ErrorBoundary({ fallback = , onError, ...props }: Props) { - const onErrorReportCrashlytics = (error: Error, info: ErrorInfo) => { +function ErrorBoundary({ + fallback = undefined, + onReset = undefined, + onError, + ...props +}: Props) { + const onErrorReport = (error: Error, info: ErrorInfo) => { // use any crash reporting tool here return onError?.(error, info); }; @@ -17,8 +25,8 @@ function ErrorBoundary({ fallback = , onError, ...props }: Props) { return ( } + onError={onErrorReport} /> ); } diff --git a/template/src/components/organisms/index.ts b/template/src/components/organisms/index.ts new file mode 100644 index 00000000..3cd68d3b --- /dev/null +++ b/template/src/components/organisms/index.ts @@ -0,0 +1 @@ +export { default as ErrorBoundary } from './ErrorBoundary/ErrorBoundary'; diff --git a/template/src/components/templates/SafeScreen/SafeScreen.tsx b/template/src/components/templates/SafeScreen/SafeScreen.tsx index 74fabba5..848be2e8 100644 --- a/template/src/components/templates/SafeScreen/SafeScreen.tsx +++ b/template/src/components/templates/SafeScreen/SafeScreen.tsx @@ -6,8 +6,8 @@ import { SafeAreaView } from 'react-native-safe-area-context'; import { useTheme } from '@/theme'; -import { ErrorBoundary } from '@/components/atoms'; import { DefaultError } from '@/components/molecules'; +import { ErrorBoundary } from '@/components/organisms'; type Props = PropsWithChildren< Omit & { @@ -17,9 +17,9 @@ type Props = PropsWithChildren< >; function SafeScreen({ - children, - isError, - onResetError, + children = undefined, + isError = false, + onResetError = undefined, style, ...props }: Props) { @@ -31,7 +31,7 @@ function SafeScreen({ backgroundColor={navigationTheme.colors.background} barStyle={variant === 'dark' ? 'light-content' : 'dark-content'} /> - }> + {isError ? : children} diff --git a/template/src/navigations/Application.tsx b/template/src/navigation/Application.tsx similarity index 88% rename from template/src/navigations/Application.tsx rename to template/src/navigation/Application.tsx index ca9c1b3e..6d9dc75a 100644 --- a/template/src/navigations/Application.tsx +++ b/template/src/navigation/Application.tsx @@ -1,11 +1,11 @@ -import type { RootStackParamList } from '@/navigations/types'; +import type { RootStackParamList } from '@/navigation/types'; import { NavigationContainer } from '@react-navigation/native'; import { createStackNavigator } from '@react-navigation/stack'; import { SafeAreaProvider } from 'react-native-safe-area-context'; import { useTheme } from '@/theme'; -import { Paths } from '@/navigations/paths'; +import { Paths } from '@/navigation/paths'; import { Example, Startup } from '@/screens'; diff --git a/template/src/navigations/paths.ts b/template/src/navigation/paths.ts similarity index 100% rename from template/src/navigations/paths.ts rename to template/src/navigation/paths.ts diff --git a/template/src/navigations/types.ts b/template/src/navigation/types.ts similarity index 85% rename from template/src/navigations/types.ts rename to template/src/navigation/types.ts index fb0133e3..290b7314 100644 --- a/template/src/navigations/types.ts +++ b/template/src/navigation/types.ts @@ -1,5 +1,5 @@ import type { StackScreenProps } from '@react-navigation/stack'; -import type { Paths } from '@/navigations/paths'; +import type { Paths } from '@/navigation/paths'; export type RootStackParamList = { [Paths.Startup]: undefined; diff --git a/template/src/screens/Example/Example.tsx b/template/src/screens/Example/Example.tsx index 149fe60c..358ea370 100644 --- a/template/src/screens/Example/Example.tsx +++ b/template/src/screens/Example/Example.tsx @@ -5,8 +5,7 @@ import { Alert, ScrollView, Text, TouchableOpacity, View } from 'react-native'; import { useTheme } from '@/theme'; import { useI18n, useUser } from '@/hooks'; -import { IconByVariant, Skeleton } from '@/components/atoms'; -import { Brand } from '@/components/molecules'; +import { AssetByVariant, IconByVariant, Skeleton } from '@/components/atoms'; import { SafeScreen } from '@/components/templates'; function Example() { @@ -59,7 +58,11 @@ function Example() { /> - + diff --git a/template/src/screens/Startup/Startup.tsx b/template/src/screens/Startup/Startup.tsx index befcbbfe..b3a0fe0b 100644 --- a/template/src/screens/Startup/Startup.tsx +++ b/template/src/screens/Startup/Startup.tsx @@ -1,4 +1,4 @@ -import type { RootScreenProps } from '@/navigations/types'; +import type { RootScreenProps } from '@/navigation/types'; import { useQuery } from '@tanstack/react-query'; import { useEffect } from 'react'; @@ -6,9 +6,9 @@ import { useTranslation } from 'react-i18next'; import { ActivityIndicator, Text, View } from 'react-native'; import { useTheme } from '@/theme'; -import { Paths } from '@/navigations/paths'; +import { Paths } from '@/navigation/paths'; -import { Brand } from '@/components/molecules'; +import { AssetByVariant } from '@/components/atoms'; import { SafeScreen } from '@/components/templates'; function Startup({ navigation }: RootScreenProps) { @@ -41,7 +41,11 @@ function Startup({ navigation }: RootScreenProps) { layout.justifyCenter, ]} > - + {isFetching && ( )} diff --git a/template/src/theme/assets/context.d.ts b/template/src/theme/assets/context.d.ts index c19c15cd..dc3c2a07 100644 --- a/template/src/theme/assets/context.d.ts +++ b/template/src/theme/assets/context.d.ts @@ -49,6 +49,7 @@ declare namespace __MetroModuleApi { * Declare process variable */ declare namespace NodeJS { + // eslint-disable-next-line @typescript-eslint/no-empty-object-type interface Require extends __MetroModuleApi.RequireFunction {} } declare let process: NodeJS.Process; diff --git a/template/src/theme/components.ts b/template/src/theme/components.ts index ea35d093..e6cc98a5 100644 --- a/template/src/theme/components.ts +++ b/template/src/theme/components.ts @@ -1,6 +1,7 @@ import type { ImageStyle, TextStyle, ViewStyle } from 'react-native'; import type { ComponentTheme } from '@/theme/types/theme'; +// eslint-disable-next-line @typescript-eslint/no-empty-object-type interface AllStyle extends Record {} diff --git a/template/src/translations/en-EN.json b/template/src/translations/en-EN.json index f13bbc08..5cf2796d 100644 --- a/template/src/translations/en-EN.json +++ b/template/src/translations/en-EN.json @@ -4,7 +4,7 @@ "full": "React Native Boilerplate", "initials": "RNB" }, - "common_error": "Quelque chose s'est mal passé.", + "common_error": "Oops! Something went wrong.", "screen_example": { "hello_user": "Hi, my name is {{name}}", "title": "Welcome on The $t(common_appName.full)", diff --git a/template/tsconfig.json b/template/tsconfig.json index f6e87661..056eaabb 100644 --- a/template/tsconfig.json +++ b/template/tsconfig.json @@ -14,7 +14,7 @@ "__mocks__/**/*", "./src/**/*", "index.d.ts", - ".eslintrc.js", + ".eslint.config.js", "jest.setup.js", "jest.config.js", "babel.config.js", diff --git a/template/yarn.lock b/template/yarn.lock index 40e28539..3f8802ab 100644 --- a/template/yarn.lock +++ b/template/yarn.lock @@ -199,7 +199,7 @@ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.7.tgz" integrity sha512-CbkjYdsJNHFk8uqpEkpCvRs3YRp9tY6FmFY7wLMSYuGYkrdUi7r2lc4/wqsvlHoMznX3WJ9IP8giGPq68T/Y6g== -"@babel/helper-validator-identifier@^7.24.5", "@babel/helper-validator-identifier@^7.25.7": +"@babel/helper-validator-identifier@^7.24.7", "@babel/helper-validator-identifier@^7.25.7": version "7.25.7" resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.7.tgz" integrity sha512-AM6TzwYqGChO45oiuPqwL2t20/HdMC1rTPAesnBCgPCSF1x3oN9MVUwQV2iyz4xqWrctwK5RNC8LV22kaQCNYg== @@ -1067,7 +1067,7 @@ pirates "^4.0.6" source-map-support "^0.5.16" -"@babel/runtime@^7.12.5", "@babel/runtime@^7.20.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.23.9", "@babel/runtime@^7.25.0", "@babel/runtime@^7.8.4": +"@babel/runtime@^7.12.5", "@babel/runtime@^7.20.0", "@babel/runtime@^7.23.2", "@babel/runtime@^7.25.0", "@babel/runtime@^7.8.4": version "7.25.7" resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz" integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== @@ -1124,30 +1124,56 @@ dependencies: eslint-visitor-keys "^3.3.0" -"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1": +"@eslint-community/regexpp@^4.10.0", "@eslint-community/regexpp@^4.11.0": version "4.11.1" resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.11.1.tgz" integrity sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q== -"@eslint/eslintrc@^2.1.4": - version "2.1.4" - resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz" - integrity sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ== +"@eslint/config-array@^0.18.0": + version "0.18.0" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.18.0.tgz#37d8fe656e0d5e3dbaea7758ea56540867fd074d" + integrity sha512-fTxvnS1sRMu3+JjXwJG0j/i4RT9u4qJ+lqS/yCGap4lH4zZGzQ7tu+xZqQmcMZq5OBZDL4QRxQzRjkWcGt8IVw== + dependencies: + "@eslint/object-schema" "^2.1.4" + debug "^4.3.1" + minimatch "^3.1.2" + +"@eslint/core@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.6.0.tgz#9930b5ba24c406d67a1760e94cdbac616a6eb674" + integrity sha512-8I2Q8ykA4J0x0o7cg67FPVnehcqWTBehu/lmY+bolPFHGjh49YzGBMXTvpqVgEbBdvNCSxj6iFgiIyHzf03lzg== + +"@eslint/eslintrc@^3.1.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.1.0.tgz#dbd3482bfd91efa663cbe7aa1f506839868207b6" + integrity sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ== dependencies: ajv "^6.12.4" debug "^4.3.2" - espree "^9.6.0" - globals "^13.19.0" + espree "^10.0.1" + globals "^14.0.0" ignore "^5.2.0" import-fresh "^3.2.1" js-yaml "^4.1.0" minimatch "^3.1.2" strip-json-comments "^3.1.1" -"@eslint/js@8.57.1": - version "8.57.1" - resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz" - integrity sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q== +"@eslint/js@9.12.0": + version "9.12.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.12.0.tgz#69ca3ca9fab9a808ec6d67b8f6edb156cbac91e1" + integrity sha512-eohesHH8WFRUprDNyEREgqP6beG6htMeUYeCpkEgBCieCMme5r9zFWjzAJp//9S+Kub4rqE+jXe9Cp1a7IYIIA== + +"@eslint/object-schema@^2.1.4": + version "2.1.4" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.4.tgz#9e69f8bb4031e11df79e03db09f9dbbae1740843" + integrity sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ== + +"@eslint/plugin-kit@^0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.2.0.tgz#8712dccae365d24e9eeecb7b346f85e750ba343d" + integrity sha512-vH9PiIMMwvhCx31Af3HiGzsVNULDbyVkHXwlemn/B0TFj/00ho3y55efXrUZTfQipxoHC5u4xq6zblww1zm1Ig== + dependencies: + levn "^0.4.1" "@hapi/hoek@^9.0.0", "@hapi/hoek@^9.3.0": version "9.3.0" @@ -1161,24 +1187,28 @@ dependencies: "@hapi/hoek" "^9.0.0" -"@humanwhocodes/config-array@^0.13.0": - version "0.13.0" - resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz" - integrity sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw== +"@humanfs/core@^0.19.0": + version "0.19.0" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.0.tgz#08db7a8c73bb07673d9ebd925f2dad746411fcec" + integrity sha512-2cbWIHbZVEweE853g8jymffCA+NCMiuqeECeBBLm8dg2oFdjuGJhgN4UAbI+6v0CKbbhvtXA4qV8YR5Ji86nmw== + +"@humanfs/node@^0.16.5": + version "0.16.5" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.5.tgz#a9febb7e7ad2aff65890fdc630938f8d20aa84ba" + integrity sha512-KSPA4umqSG4LHYRodq31VDwKAvaTF4xmVlzM8Aeh4PlU1JQ3IG0wiA8C25d3RQ9nJyM3mBHyI53K06VVL/oFFg== dependencies: - "@humanwhocodes/object-schema" "^2.0.3" - debug "^4.3.1" - minimatch "^3.0.5" + "@humanfs/core" "^0.19.0" + "@humanwhocodes/retry" "^0.3.0" "@humanwhocodes/module-importer@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== -"@humanwhocodes/object-schema@^2.0.3": - version "2.0.3" - resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" - integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.3.0", "@humanwhocodes/retry@^0.3.1": + version "0.3.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.3.1.tgz#c72a5c76a9fbaf3488e231b13dc52c0da7bab42a" + integrity sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA== "@ianvs/prettier-plugin-sort-imports@^4.3.1": version "4.3.1" @@ -1483,7 +1513,7 @@ resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": +"@nodelib/fs.walk@^1.2.3": version "1.2.8" resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1491,11 +1521,6 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@nolyfill/is-core-module@1.0.39": - version "1.0.39" - resolved "https://registry.npmjs.org/@nolyfill/is-core-module/-/is-core-module-1.0.39.tgz" - integrity sha512-nn5ozdjYQpUCZlWGuxcJY/KpxkWQs4DcbMCmKojjyrYDEAGy4Ce19NN4v5MduafTwJlbKc99UA8YhSVqq9yPZA== - "@react-native-community/cli-clean@14.1.0": version "14.1.0" resolved "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-14.1.0.tgz" @@ -1935,9 +1960,9 @@ resolved "https://registry.npmjs.org/@react-navigation/elements/-/elements-1.3.31.tgz" integrity sha512-bUzP4Awlljx5RKEExw8WYtif8EuQni2glDaieYROKTnaxsu9kEIA515sXQgUDZU4Ob12VoL7+z70uO3qrlfXcQ== -"@react-navigation/native@^6.1.17": +"@react-navigation/native@^6.1.18": version "6.1.18" - resolved "https://registry.npmjs.org/@react-navigation/native/-/native-6.1.18.tgz" + resolved "https://registry.yarnpkg.com/@react-navigation/native/-/native-6.1.18.tgz#338fa9afa2c89feec1d3eac41c963840d8d6f106" integrity sha512-mIT9MiL/vMm4eirLcmw2h6h/Nm5FICtnYSdohq4vTLA2FF/6PNhByM7s8ffqoVfE5L0uAa6Xda1B7oddolUiGg== dependencies: "@react-navigation/core" "^6.4.17" @@ -1952,9 +1977,9 @@ dependencies: nanoid "^3.1.23" -"@react-navigation/stack@^6.3.29": +"@react-navigation/stack@^6.4.1": version "6.4.1" - resolved "https://registry.npmjs.org/@react-navigation/stack/-/stack-6.4.1.tgz" + resolved "https://registry.yarnpkg.com/@react-navigation/stack/-/stack-6.4.1.tgz#a158350637f5298292202ce854e5c5c9688f23f9" integrity sha512-upMEHOKMtuMu4c9gmoPlO/JqI6mDlSqwXg1aXKOTQLXAF8H5koOLRfrmi7AkdiE9A7lDXWUAZoGuD9O88cYvDQ== dependencies: "@react-navigation/elements" "^1.3.31" @@ -2094,17 +2119,17 @@ deepmerge "^4.3.1" svgo "^3.0.2" -"@tanstack/query-core@5.59.0": - version "5.59.0" - resolved "https://registry.npmjs.org/@tanstack/query-core/-/query-core-5.59.0.tgz" - integrity sha512-WGD8uIhX6/deH/tkZqPNcRyAhDUqs729bWKoByYHSogcshXfFbppOdTER5+qY7mFvu8KEFJwT0nxr8RfPTVh0Q== +"@tanstack/query-core@5.59.9": + version "5.59.9" + resolved "https://registry.yarnpkg.com/@tanstack/query-core/-/query-core-5.59.9.tgz#8a41137e6693cd0bca3a6e3eb802d119c1352900" + integrity sha512-vFGnblfJOKlOPyTR5M0ohWKb/03eGubh5KuGyzsDfc7VQ6F0nsB75kQIoLpwp3Wfj6fKv0wGoTUX8BsIfhxDfw== -"@tanstack/react-query@^5.31.0": - version "5.59.0" - resolved "https://registry.npmjs.org/@tanstack/react-query/-/react-query-5.59.0.tgz" - integrity sha512-YDXp3OORbYR+8HNQx+lf4F73NoiCmCcSvZvgxE29OifmQFk0sBlO26NWLHpcNERo92tVk3w+JQ53/vkcRUY1hA== +"@tanstack/react-query@^5.59.8": + version "5.59.9" + resolved "https://registry.yarnpkg.com/@tanstack/react-query/-/react-query-5.59.9.tgz#d4e40f1ac4106330bcc4e85a77914ccca8beee21" + integrity sha512-g2cbiw/ZIIrnUaQqhGtarTAsuLdKDNLtY5HNfRHVWY9kHDj96M4qs4ygJxHc119tPQpzZe4i9W7d2Gc2Gvng2A== dependencies: - "@tanstack/query-core" "5.59.0" + "@tanstack/query-core" "5.59.9" "@testing-library/jest-native@^5.4.2": version "5.4.3" @@ -2164,6 +2189,11 @@ dependencies: "@babel/types" "^7.20.7" +"@types/estree@^1.0.6": + version "1.0.6" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50" + integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw== + "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" @@ -2203,7 +2233,7 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/json-schema@^7.0.12", "@types/json-schema@^7.0.9": +"@types/json-schema@^7.0.15", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -2259,7 +2289,7 @@ "@types/prop-types" "*" csstype "^3.0.2" -"@types/semver@^7.3.12", "@types/semver@^7.5.0": +"@types/semver@^7.3.12": version "7.5.8" resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz" integrity sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ== @@ -2288,22 +2318,20 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@7.1.1": - version "7.1.1" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz" - integrity sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw== +"@typescript-eslint/eslint-plugin@8.8.1": + version "8.8.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.8.1.tgz#9364b756d4d78bcbdf6fd3e9345e6924c68ad371" + integrity sha512-xfvdgA8AP/vxHgtgU310+WBnLB4uJQ9XdyP17RebG26rLtDrQJV3ZYrcopX91GrHmMoH8bdSwMRh2a//TiJ1jQ== dependencies: - "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "7.1.1" - "@typescript-eslint/type-utils" "7.1.1" - "@typescript-eslint/utils" "7.1.1" - "@typescript-eslint/visitor-keys" "7.1.1" - debug "^4.3.4" + "@eslint-community/regexpp" "^4.10.0" + "@typescript-eslint/scope-manager" "8.8.1" + "@typescript-eslint/type-utils" "8.8.1" + "@typescript-eslint/utils" "8.8.1" + "@typescript-eslint/visitor-keys" "8.8.1" graphemer "^1.4.0" - ignore "^5.2.4" + ignore "^5.3.1" natural-compare "^1.4.0" - semver "^7.5.4" - ts-api-utils "^1.0.1" + ts-api-utils "^1.3.0" "@typescript-eslint/eslint-plugin@^7.1.1": version "7.18.0" @@ -2327,6 +2355,17 @@ dependencies: "@typescript-eslint/utils" "5.62.0" +"@typescript-eslint/parser@8.8.1": + version "8.8.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.8.1.tgz#5952ba2a83bd52024b872f3fdc8ed2d3636073b8" + integrity sha512-hQUVn2Lij2NAxVFEdvIGxT9gP1tq2yM83m+by3whWFsWC+1y8pxxxHUFE1UqDu2VsGi2i6RLcv4QvouM84U+ow== + dependencies: + "@typescript-eslint/scope-manager" "8.8.1" + "@typescript-eslint/types" "8.8.1" + "@typescript-eslint/typescript-estree" "8.8.1" + "@typescript-eslint/visitor-keys" "8.8.1" + debug "^4.3.4" + "@typescript-eslint/parser@^7.1.1": version "7.1.1" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz" @@ -2370,16 +2409,6 @@ "@typescript-eslint/types" "8.8.1" "@typescript-eslint/visitor-keys" "8.8.1" -"@typescript-eslint/type-utils@7.1.1": - version "7.1.1" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz" - integrity sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g== - dependencies: - "@typescript-eslint/typescript-estree" "7.1.1" - "@typescript-eslint/utils" "7.1.1" - debug "^4.3.4" - ts-api-utils "^1.0.1" - "@typescript-eslint/type-utils@7.18.0": version "7.18.0" resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz" @@ -2390,6 +2419,16 @@ debug "^4.3.4" ts-api-utils "^1.3.0" +"@typescript-eslint/type-utils@8.8.1": + version "8.8.1" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.8.1.tgz#31f59ec46e93a02b409fb4d406a368a59fad306e" + integrity sha512-qSVnpcbLP8CALORf0za+vjLYj1Wp8HSoiI8zYU5tHxRVj30702Z1Yw4cLwfNKhTPWp5+P+k1pjmD5Zd1nhxiZA== + dependencies: + "@typescript-eslint/typescript-estree" "8.8.1" + "@typescript-eslint/utils" "8.8.1" + debug "^4.3.4" + ts-api-utils "^1.3.0" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" @@ -2479,19 +2518,6 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@7.1.1": - version "7.1.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz" - integrity sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "7.1.1" - "@typescript-eslint/types" "7.1.1" - "@typescript-eslint/typescript-estree" "7.1.1" - semver "^7.5.4" - "@typescript-eslint/utils@7.18.0": version "7.18.0" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz" @@ -2502,9 +2528,9 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/typescript-estree" "7.18.0" -"@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": +"@typescript-eslint/utils@8.8.1", "@typescript-eslint/utils@^6.0.0 || ^7.0.0 || ^8.0.0": version "8.8.1" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.8.1.tgz" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.8.1.tgz#9e29480fbfa264c26946253daa72181f9f053c9d" integrity sha512-/QkNJDbV0bdL7H7d0/y0qBbV2HTtf0TIyjSDTvvmQEzeVx8jEImEbLuOA4EsvE8gIgqMitns0ifb5uQhMj8d9w== dependencies: "@eslint-community/eslint-utils" "^4.4.0" @@ -2544,11 +2570,6 @@ "@typescript-eslint/types" "8.8.1" eslint-visitor-keys "^3.4.3" -"@ungap/structured-clone@^1.2.0": - version "1.2.0" - resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" - integrity sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ== - abort-controller@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz" @@ -2569,7 +2590,7 @@ acorn-jsx@^5.3.2: resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== -acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.12.0, acorn@^8.8.2: version "8.12.1" resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== @@ -3277,7 +3298,7 @@ convert-source-map@^2.0.0: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-js-compat@^3.37.0, core-js-compat@^3.38.0, core-js-compat@^3.38.1: +core-js-compat@^3.38.0, core-js-compat@^3.38.1: version "3.38.1" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz" integrity sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw== @@ -3439,7 +3460,7 @@ debug@^3.2.7: dependencies: ms "^2.1.1" -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5: +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: version "4.3.7" resolved "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz" integrity sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ== @@ -3535,13 +3556,6 @@ doctrine@^2.1.0: dependencies: esutils "^2.0.2" -doctrine@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" - integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== - dependencies: - esutils "^2.0.2" - dom-serializer@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" @@ -3615,14 +3629,6 @@ encodeurl@~2.0.0: resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz" integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg== -enhanced-resolve@^5.15.0: - version "5.17.1" - resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz" - integrity sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg== - dependencies: - graceful-fs "^4.2.4" - tapable "^2.2.0" - entities@^4.2.0, entities@^4.4.0: version "4.5.0" resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" @@ -3815,21 +3821,7 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" -eslint-import-resolver-typescript@^3.6.3: - version "3.6.3" - resolved "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.6.3.tgz" - integrity sha512-ud9aw4szY9cCT1EWWdGv1L1XR6hh2PaRWif0j2QjQ0pgTY/69iw+W0Z4qZv5wHahOl8isEr+k/JnyAqNQkLkIA== - dependencies: - "@nolyfill/is-core-module" "1.0.39" - debug "^4.3.5" - enhanced-resolve "^5.15.0" - eslint-module-utils "^2.8.1" - fast-glob "^3.3.2" - get-tsconfig "^4.7.5" - is-bun-module "^1.0.2" - is-glob "^4.0.3" - -eslint-module-utils@^2.12.0, eslint-module-utils@^2.8.1: +eslint-module-utils@^2.12.0: version "2.12.0" resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz" integrity sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg== @@ -3852,9 +3844,9 @@ eslint-plugin-ft-flow@^2.0.1: lodash "^4.17.21" string-natural-compare "^3.0.1" -eslint-plugin-import@^2.30.0: +eslint-plugin-import@^2.31.0: version "2.31.0" - resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz#310ce7e720ca1d9c0bb3f69adfd1c6bdd7d9e0e7" integrity sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A== dependencies: "@rtsao/scc" "^1.1.0" @@ -3886,7 +3878,7 @@ eslint-plugin-jest@^27.9.0: eslint-plugin-jest@^28.8.3: version "28.8.3" - resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-jest/-/eslint-plugin-jest-28.8.3.tgz#c5699bba0ad06090ad613535e4f1572f4c2567c0" integrity sha512-HIQ3t9hASLKm2IhIOqnu+ifw7uLZkIlR7RYNv7fMcEi/p0CIiJmfriStQS2LDkgtY4nyLbIZAD+JL347Yc2ETQ== dependencies: "@typescript-eslint/utils" "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -3896,11 +3888,16 @@ eslint-plugin-no-instanceof@^1.0.1: resolved "https://registry.npmjs.org/eslint-plugin-no-instanceof/-/eslint-plugin-no-instanceof-1.0.1.tgz" integrity sha512-zlqQ7EsfzbRO68uI+p8FIE7zYB4njs+nNbkNjSb5QmLi2et67zQLqSeaao5U9SpnlZTTJC87nS2oyHo2ACtajw== -eslint-plugin-react-hooks@^4.6.0, eslint-plugin-react-hooks@^4.6.2: +eslint-plugin-react-hooks@^4.6.0: version "4.6.2" resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== +eslint-plugin-react-hooks@^5.1.0-rc-70fb1363-20241010: + version "5.1.0-rc-70fb1363-20241010" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.1.0-rc-70fb1363-20241010.tgz#941d4616c03b1ce6d3644c9866cc118ae8c1d32f" + integrity sha512-ACpE3p5orWvc0bh5qsH65ujmM1xrPTSTmB73EGR9fn5QTqNmoHNEA5kC9f4Z9FP9rm0E9tvrFgRw2/UfoqdxIQ== + eslint-plugin-react-native-globals@^0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/eslint-plugin-react-native-globals/-/eslint-plugin-react-native-globals-0.1.2.tgz" @@ -3913,9 +3910,9 @@ eslint-plugin-react-native@^4.0.0: dependencies: eslint-plugin-react-native-globals "^0.1.1" -eslint-plugin-react@^7.30.1: +eslint-plugin-react@^7.30.1, eslint-plugin-react@^7.37.1: version "7.37.1" - resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.1.tgz#56493d7d69174d0d828bc83afeffe96903fdadbd" integrity sha512-xwTnwDqzbDRA8uJ7BMxPs/EXRB3i8ZfnOIp8BsxEQkT0nHPp+WWceqGgo6rKb9ctNi8GJLDT4Go5HAWELa/WMg== dependencies: array-includes "^3.1.8" @@ -3937,27 +3934,27 @@ eslint-plugin-react@^7.30.1: string.prototype.matchall "^4.0.11" string.prototype.repeat "^1.0.0" -eslint-plugin-typescript-sort-keys@^3.2.0: +eslint-plugin-typescript-sort-keys@^3.3.0: version "3.3.0" - resolved "https://registry.npmjs.org/eslint-plugin-typescript-sort-keys/-/eslint-plugin-typescript-sort-keys-3.3.0.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-typescript-sort-keys/-/eslint-plugin-typescript-sort-keys-3.3.0.tgz#a3ba29e5d6b7f3e5e66ad898347fa9142d3596d1" integrity sha512-bRW3Rc/VNdrSP9OoY5wgjjaXCOOkZKpzvl/Mk6l8Sg8CMehVIcg9K4y33l+ZcZiknpl0aR6rKusxuCJNGZWmVw== dependencies: "@typescript-eslint/experimental-utils" "^5.0.0" json-schema "^0.4.0" natural-compare-lite "^1.4.0" -eslint-plugin-unicorn@^55.0.0: - version "55.0.0" - resolved "https://registry.npmjs.org/eslint-plugin-unicorn/-/eslint-plugin-unicorn-55.0.0.tgz" - integrity sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA== +eslint-plugin-unicorn@^56.0.0: + version "56.0.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-unicorn/-/eslint-plugin-unicorn-56.0.0.tgz#9fd3ebe6f478571734541fa745026b743175b59e" + integrity sha512-aXpddVz/PQMmd69uxO98PA4iidiVNvA0xOtbpUoz1WhBd4RxOQQYqN618v68drY0hmy5uU2jy1bheKEVWBjlPw== dependencies: - "@babel/helper-validator-identifier" "^7.24.5" + "@babel/helper-validator-identifier" "^7.24.7" "@eslint-community/eslint-utils" "^4.4.0" ci-info "^4.0.0" clean-regexp "^1.0.0" - core-js-compat "^3.37.0" - esquery "^1.5.0" - globals "^15.7.0" + core-js-compat "^3.38.1" + esquery "^1.6.0" + globals "^15.9.0" indent-string "^4.0.0" is-builtin-module "^3.2.1" jsesc "^3.0.2" @@ -3965,12 +3962,12 @@ eslint-plugin-unicorn@^55.0.0: read-pkg-up "^7.0.1" regexp-tree "^0.1.27" regjsparser "^0.10.0" - semver "^7.6.1" + semver "^7.6.3" strip-indent "^3.0.0" eslint-plugin-unused-imports@^4.1.4: version "4.1.4" - resolved "https://registry.npmjs.org/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz" + resolved "https://registry.yarnpkg.com/eslint-plugin-unused-imports/-/eslint-plugin-unused-imports-4.1.4.tgz#62ddc7446ccbf9aa7b6f1f0b00a980423cda2738" integrity sha512-YptD6IzQjDardkl0POxnnRBhU1OEePMV0nd6siHaRBbd+lyh6NAhFEobiznKU7kTsSsDeSD62Pe7kAM1b7dAZQ== eslint-scope@5.1.1, eslint-scope@^5.1.1: @@ -3981,10 +3978,10 @@ eslint-scope@5.1.1, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-scope@^7.2.2: - version "7.2.2" - resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" - integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== +eslint-scope@^8.1.0: + version "8.1.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.1.0.tgz#70214a174d4cbffbc3e8a26911d8bf51b9ae9d30" + integrity sha512-14dSvlhaVhKKsa9Fx1l8A17s7ah7Ef7wCakJ10LYk6+GYmP9yDti2oq2SEwcyndt6knfcZyhyxwY3i9yL78EQw== dependencies: esrecurse "^4.3.0" estraverse "^5.2.0" @@ -3999,67 +3996,69 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -eslint@^8.57.1: - version "8.57.1" - resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" - integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== +eslint-visitor-keys@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.1.0.tgz#1f785cc5e81eb7534523d85922248232077d2f8c" + integrity sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg== + +eslint@^9.12.0: + version "9.12.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.12.0.tgz#54fcba2876c90528396da0fa44b6446329031e86" + integrity sha512-UVIOlTEWxwIopRL1wgSQYdnVDcEvs2wyaO6DGo5mXqe3r16IoCNWkR29iHhyaP4cICWjbgbmFUGAhh0GJRuGZw== dependencies: "@eslint-community/eslint-utils" "^4.2.0" - "@eslint-community/regexpp" "^4.6.1" - "@eslint/eslintrc" "^2.1.4" - "@eslint/js" "8.57.1" - "@humanwhocodes/config-array" "^0.13.0" + "@eslint-community/regexpp" "^4.11.0" + "@eslint/config-array" "^0.18.0" + "@eslint/core" "^0.6.0" + "@eslint/eslintrc" "^3.1.0" + "@eslint/js" "9.12.0" + "@eslint/plugin-kit" "^0.2.0" + "@humanfs/node" "^0.16.5" "@humanwhocodes/module-importer" "^1.0.1" - "@nodelib/fs.walk" "^1.2.8" - "@ungap/structured-clone" "^1.2.0" + "@humanwhocodes/retry" "^0.3.1" + "@types/estree" "^1.0.6" + "@types/json-schema" "^7.0.15" ajv "^6.12.4" chalk "^4.0.0" cross-spawn "^7.0.2" debug "^4.3.2" - doctrine "^3.0.0" escape-string-regexp "^4.0.0" - eslint-scope "^7.2.2" - eslint-visitor-keys "^3.4.3" - espree "^9.6.1" - esquery "^1.4.2" + eslint-scope "^8.1.0" + eslint-visitor-keys "^4.1.0" + espree "^10.2.0" + esquery "^1.5.0" esutils "^2.0.2" fast-deep-equal "^3.1.3" - file-entry-cache "^6.0.1" + file-entry-cache "^8.0.0" find-up "^5.0.0" glob-parent "^6.0.2" - globals "^13.19.0" - graphemer "^1.4.0" ignore "^5.2.0" imurmurhash "^0.1.4" is-glob "^4.0.0" - is-path-inside "^3.0.3" - js-yaml "^4.1.0" json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.4.1" lodash.merge "^4.6.2" minimatch "^3.1.2" natural-compare "^1.4.0" optionator "^0.9.3" - strip-ansi "^6.0.1" text-table "^0.2.0" -espree@^9.6.0, espree@^9.6.1: - version "9.6.1" - resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" - integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== +espree@^10.0.1, espree@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.2.0.tgz#f4bcead9e05b0615c968e85f83816bc386a45df6" + integrity sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g== dependencies: - acorn "^8.9.0" + acorn "^8.12.0" acorn-jsx "^5.3.2" - eslint-visitor-keys "^3.4.1" + eslint-visitor-keys "^4.1.0" esprima@^4.0.0, esprima@~4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.4.2, esquery@^1.5.0: +esquery@^1.5.0, esquery@^1.6.0: version "1.6.0" - resolved "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.6.0.tgz#91419234f804d852a82dceec3e16cdc22cf9dae7" integrity sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg== dependencies: estraverse "^5.1.0" @@ -4179,12 +4178,12 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -file-entry-cache@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" - integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== dependencies: - flat-cache "^3.0.4" + flat-cache "^4.0.0" fill-range@^7.1.1: version "7.1.1" @@ -4250,14 +4249,13 @@ find-up@^5.0.0: locate-path "^6.0.0" path-exists "^4.0.0" -flat-cache@^3.0.4: - version "3.2.0" - resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz" - integrity sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw== +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== dependencies: flatted "^3.2.9" - keyv "^4.5.3" - rimraf "^3.0.2" + keyv "^4.5.4" flatted@^3.2.9: version "3.3.1" @@ -4365,13 +4363,6 @@ get-symbol-description@^1.0.2: es-errors "^1.3.0" get-intrinsic "^1.2.4" -get-tsconfig@^4.7.5: - version "4.8.1" - resolved "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.8.1.tgz" - integrity sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg== - dependencies: - resolve-pkg-maps "^1.0.0" - glob-parent@^5.1.2: version "5.1.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" @@ -4413,17 +4404,15 @@ globals@^11.1.0: resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^13.19.0: - version "13.24.0" - resolved "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz" - integrity sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ== - dependencies: - type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== -globals@^15.7.0: - version "15.10.0" - resolved "https://registry.npmjs.org/globals/-/globals-15.10.0.tgz" - integrity sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ== +globals@^15.9.0: + version "15.11.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-15.11.0.tgz#b96ed4c6998540c6fb824b24b5499216d2438d6e" + integrity sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw== globalthis@^1.0.3: version "1.0.4" @@ -4572,9 +4561,9 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -i18next@^23.11.2: +i18next@^23.15.2: version "23.15.2" - resolved "https://registry.npmjs.org/i18next/-/i18next-23.15.2.tgz" + resolved "https://registry.yarnpkg.com/i18next/-/i18next-23.15.2.tgz#8a54f877ccbbc46696eacb5bd5b31d84f9ade7cb" integrity sha512-zcPSWzCvw6uKnuYHIqs4W7hTuB9e3AFcSdZgvCWoPXIZsBjBd4djN2/2uOHIB+1DFFkQnMBXvhNg7J3WyCuywQ== dependencies: "@babel/runtime" "^7.23.2" @@ -4584,7 +4573,7 @@ ieee754@^1.1.13: resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== -ignore@^5.0.5, ignore@^5.2.0, ignore@^5.2.4, ignore@^5.3.1: +ignore@^5.0.5, ignore@^5.2.0, ignore@^5.3.1: version "5.3.2" resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz" integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g== @@ -4711,13 +4700,6 @@ is-builtin-module@^3.2.1: dependencies: builtin-modules "^3.3.0" -is-bun-module@^1.0.2: - version "1.2.1" - resolved "https://registry.npmjs.org/is-bun-module/-/is-bun-module-1.2.1.tgz" - integrity sha512-AmidtEM6D6NmUiLOvvU7+IePxjEjOzra2h0pSrsfSAcXwl/83zLLXDByafUJy9k/rKK0pvXMLdwKwGHlX2Ke6Q== - dependencies: - semver "^7.6.3" - is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: version "1.2.7" resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" @@ -4822,11 +4804,6 @@ is-number@^7.0.0: resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== -is-path-inside@^3.0.3: - version "3.0.3" - resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" - integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== - is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" @@ -5349,9 +5326,9 @@ jest-worker@^29.6.3, jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@^29.6.3: +jest@^29.7.0: version "29.7.0" - resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" + resolved "https://registry.yarnpkg.com/jest/-/jest-29.7.0.tgz#994676fc24177f088f1c5e3737f5697204ff2613" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== dependencies: "@jest/core" "^29.7.0" @@ -5494,9 +5471,9 @@ jsonfile@^4.0.0: object.assign "^4.1.4" object.values "^1.1.6" -keyv@^4.5.3: +keyv@^4.5.4: version "4.5.4" - resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" + resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== dependencies: json-buffer "3.0.1" @@ -5511,9 +5488,9 @@ kleur@^3.0.3: resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== -ky@^1.2.4: +ky@^1.7.2: version "1.7.2" - resolved "https://registry.npmjs.org/ky/-/ky-1.7.2.tgz" + resolved "https://registry.yarnpkg.com/ky/-/ky-1.7.2.tgz#b97d9b997ba51ff1e152f0815d3d27b86513eb1c" integrity sha512-OzIvbHKKDpi60TnF9t7UUVAF1B4mcqc02z5PIvrm08Wyb+yOcz63GRvEuVxNT18a9E1SrNouhB4W2NNLeD7Ykg== leven@^3.1.0: @@ -5934,7 +5911,7 @@ minimatch@9.0.3: dependencies: brace-expansion "^2.0.1" -minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6531,12 +6508,12 @@ react-freeze@^1.0.0: resolved "https://registry.npmjs.org/react-freeze/-/react-freeze-1.0.4.tgz" integrity sha512-r4F0Sec0BLxWicc7HEyo2x3/2icUTrRmDjaaRyzzn+7aDyFZliszMDOgLVwSnQnYENOlL1o569Ze2HZefk8clA== -react-i18next@^14.1.0: - version "14.1.3" - resolved "https://registry.npmjs.org/react-i18next/-/react-i18next-14.1.3.tgz" - integrity sha512-wZnpfunU6UIAiJ+bxwOiTmBOAaB14ha97MjOEnLGac2RJ+h/maIYXZuTHlmyqQVX1UVHmU1YDTQ5vxLmwfXTjw== +react-i18next@^15.0.2: + version "15.0.2" + resolved "https://registry.yarnpkg.com/react-i18next/-/react-i18next-15.0.2.tgz#8b7f3c0e66cb4f99f95e2c507353398c41a68cc2" + integrity sha512-z0W3/RES9Idv3MmJUcf0mDNeeMOUXe+xoL0kPfQPbDoZHmni/XsIoq5zgT2MCFUiau283GuBUK578uD/mkAbLQ== dependencies: - "@babel/runtime" "^7.23.9" + "@babel/runtime" "^7.25.0" html-parse-stringify "^3.0.1" "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.3.1: @@ -6559,9 +6536,9 @@ react-native-flipper@^0.164.0: resolved "https://registry.npmjs.org/react-native-flipper/-/react-native-flipper-0.164.0.tgz" integrity sha512-iJhIe3rqx6okuzBp4AJsTa2b8VRAOGzoLRFx/4HGbaGvu8AurZjz8TTQkhJsRma8dsHN2b6KKZPvGGW3wdWzvA== -react-native-gesture-handler@^2.16.0: +react-native-gesture-handler@^2.20.0: version "2.20.0" - resolved "https://registry.npmjs.org/react-native-gesture-handler/-/react-native-gesture-handler-2.20.0.tgz" + resolved "https://registry.yarnpkg.com/react-native-gesture-handler/-/react-native-gesture-handler-2.20.0.tgz#2d9ec4e9bd22619ebe36269dda3ecb1173928276" integrity sha512-rFKqgHRfxQ7uSAivk8vxCiW4SB3G0U7jnv7kZD4Y90K5kp6YrU8Q3tWhxe3Rx55BIvSd3mBe9ZWbWVJ0FsSHPA== dependencies: "@egjs/hammerjs" "^2.0.17" @@ -6571,12 +6548,12 @@ react-native-gesture-handler@^2.16.0: react-native-mmkv@^2.12.2: version "2.12.2" - resolved "https://registry.npmjs.org/react-native-mmkv/-/react-native-mmkv-2.12.2.tgz" + resolved "https://registry.yarnpkg.com/react-native-mmkv/-/react-native-mmkv-2.12.2.tgz#4bba0f5f04e2cf222494cce3a9794ba6a4894dee" integrity sha512-6058Aq0p57chPrUutLGe9fYoiDVDNMU2PKV+lLFUJ3GhoHvUrLdsS1PDSCLr00yqzL4WJQ7TTzH+V8cpyrNcfg== -react-native-reanimated@^3.9.0-rc.1: +react-native-reanimated@^3.15.4: version "3.15.4" - resolved "https://registry.npmjs.org/react-native-reanimated/-/react-native-reanimated-3.15.4.tgz" + resolved "https://registry.yarnpkg.com/react-native-reanimated/-/react-native-reanimated-3.15.4.tgz#0d4aa65b53f9c845fe8c33aa8a3ad3d06a23f063" integrity sha512-jcpHE+MnsvSbClhHgAFoken7SnaHrUJ5gVA8BUw8S1j6rkrw2VzRpht6cxn14NlqYx5ytjfG9IXJDOzq8tFvfw== dependencies: "@babel/plugin-transform-arrow-functions" "^7.0.0-0" @@ -6596,7 +6573,7 @@ react-native-safe-area-context@^4.11.0: resolved "https://registry.yarnpkg.com/react-native-safe-area-context/-/react-native-safe-area-context-4.11.0.tgz#d45271363672dc1923ddb0ce5a6ad588e210c85d" integrity sha512-Bg7bozxEB+ZS+H3tVYs5yY1cvxNXgR6nRQwpSMkYR9IN5CbxohLnSprrOPG/ostTCd4F6iCk0c51pExEhifSKQ== -react-native-screens@^3.34.0: +react-native-screens@3.34.0: version "3.34.0" resolved "https://registry.yarnpkg.com/react-native-screens/-/react-native-screens-3.34.0.tgz#1291a460c5bc59e2ba581b42d40fa9a58d3b1197" integrity sha512-8ri3Pd9QcpfXnVckOe/Lnto+BXmSPHV/Q0RB0XW0gDKsCv5wi5k7ez7g1SzgiYHl29MSdiqgjH30zUyOOowOaw== @@ -6709,14 +6686,14 @@ reactotron-core-contract@0.2.4: resolved "https://registry.npmjs.org/reactotron-core-contract/-/reactotron-core-contract-0.2.4.tgz" integrity sha512-CmNYahBdk9uES4vimlRsoM1gAQA6T5gXTuJzDvduOjKd0IZufZjkxzBAvhpkX5OIkPl4Xlsv+1AHXLWSJSwFLA== -reactotron-react-native-mmkv@^0.2.6: +reactotron-react-native-mmkv@^0.2.7: version "0.2.7" - resolved "https://registry.npmjs.org/reactotron-react-native-mmkv/-/reactotron-react-native-mmkv-0.2.7.tgz" + resolved "https://registry.yarnpkg.com/reactotron-react-native-mmkv/-/reactotron-react-native-mmkv-0.2.7.tgz#2006e08fa55b0ed37d31f786985a8741e40c47c5" integrity sha512-kORVMqmbl79BNAXgTjUeX0k6u6tzFxpt9jNMrHqpDniQSSHgn+wcP8LkXSPyYntH1yHifE8S4iJIMqQeXTT5yw== -reactotron-react-native@^5.1.6: +reactotron-react-native@^5.1.9: version "5.1.9" - resolved "https://registry.npmjs.org/reactotron-react-native/-/reactotron-react-native-5.1.9.tgz" + resolved "https://registry.yarnpkg.com/reactotron-react-native/-/reactotron-react-native-5.1.9.tgz#1d9d557817e9f10f9c33c1339c54b46690f6ed97" integrity sha512-tHkC5ZADXBJ9vRcs8TFEWOcK1QzHEzI3UnorwDDSU3hnWpwVt5MtxBcgQkicLIRWcPROe4lIJMf6SG9uc+opuA== dependencies: mitt "^3.0.1" @@ -6918,11 +6895,6 @@ resolve-from@^5.0.0: resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== -resolve-pkg-maps@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz" - integrity sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw== - resolve.exports@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" @@ -7041,7 +7013,7 @@ semver@^6.3.0, semver@^6.3.1: resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.1.3, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.1, semver@^7.6.3: +semver@^7.1.3, semver@^7.3.7, semver@^7.5.2, semver@^7.5.3, semver@^7.5.4, semver@^7.6.0, semver@^7.6.3: version "7.6.3" resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== @@ -7471,11 +7443,6 @@ svgo@^3.0.2: csso "^5.0.5" picocolors "^1.0.0" -tapable@^2.2.0: - version "2.2.1" - resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" - integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== - temp@^0.8.4: version "0.8.4" resolved "https://registry.npmjs.org/temp/-/temp-0.8.4.tgz" @@ -7591,11 +7558,6 @@ type-detect@4.0.8: resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== -type-fest@^0.20.2: - version "0.20.2" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" - integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== - type-fest@^0.21.3: version "0.21.3" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" @@ -7660,10 +7622,19 @@ typed-array-length@^1.0.6: is-typed-array "^1.1.13" possible-typed-array-names "^1.0.0" -typescript@5.1.3: - version "5.1.3" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.1.3.tgz" - integrity sha512-XH627E9vkeqhlZFQuL+UsyAXEnibT0kWR2FWONlr4sTjvxyJYnyefgrkyECLzM5NenmKzRAy2rR/OlYLA1HkZw== +typescript-eslint@^8.8.1: + version "8.8.1" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.8.1.tgz#b375c877b2184d883b6228170bc66f0fca847c9a" + integrity sha512-R0dsXFt6t4SAFjUSKFjMh4pXDtq04SsFKCVGDP3ZOzNP7itF0jBcZYU4fMsZr4y7O7V7Nc751dDeESbe4PbQMQ== + dependencies: + "@typescript-eslint/eslint-plugin" "8.8.1" + "@typescript-eslint/parser" "8.8.1" + "@typescript-eslint/utils" "8.8.1" + +typescript@5.6.3: + version "5.6.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b" + integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw== unbox-primitive@^1.0.2: version "1.0.2"