diff --git a/android/app/build.gradle b/android/app/build.gradle index f236eef..5d02b25 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -2,8 +2,6 @@ apply plugin: "com.android.application" apply plugin: "org.jetbrains.kotlin.android" apply plugin: "com.facebook.react" -apply from: file("../../node_modules/react-native-vector-icons/fonts.gradle") - apply from: project(':react-native-config').projectDir.getPath() + "/dotenv.gradle" /** diff --git a/ios/Podfile.lock b/ios/Podfile.lock index f8c78fa..8d7e4ab 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -2132,7 +2132,8 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - RNVectorIcons (10.2.0): + - SocketRocket (0.7.1) + - Teleport (0.3.0): - DoubleConversion - glog - hermes-engine @@ -2156,7 +2157,6 @@ PODS: - ReactCommon/turbomodule/bridging - ReactCommon/turbomodule/core - Yoga - - SocketRocket (0.7.1) - Unistyles (3.0.10): - DoubleConversion - glog @@ -2269,7 +2269,7 @@ DEPENDENCIES: - RNReanimated (from `../node_modules/react-native-reanimated`) - RNScreens (from `../node_modules/react-native-screens`) - RNSVG (from `../node_modules/react-native-svg`) - - RNVectorIcons (from `../node_modules/react-native-vector-icons`) + - Teleport (from `../node_modules/react-native-teleport`) - Unistyles (from `../node_modules/react-native-unistyles`) - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) @@ -2443,8 +2443,8 @@ EXTERNAL SOURCES: :path: "../node_modules/react-native-screens" RNSVG: :path: "../node_modules/react-native-svg" - RNVectorIcons: - :path: "../node_modules/react-native-vector-icons" + Teleport: + :path: "../node_modules/react-native-teleport" Unistyles: :path: "../node_modules/react-native-unistyles" Yoga: @@ -2533,8 +2533,8 @@ SPEC CHECKSUMS: RNReanimated: 730ffe6cf7b931f78b795e6b6e0920dcab9c8beb RNScreens: 5483638048b69594b925071d6119de6eb6072e96 RNSVG: ba53827311fd9f8a14e06626365a749ce7713975 - RNVectorIcons: 941a39b5d3b9d8cf8ac2e2fc09b07bfafbcf9796 SocketRocket: d4aabe649be1e368d1318fdf28a022d714d65748 + Teleport: 402604f5a4f762d39ce519ecc8d1925fe7d040f8 Unistyles: c4da33859831bf03bd650835677f7d08b2a6755b Yoga: 9773f1327b258fa449988c2e42fbb7cbdf655d96 diff --git a/ios/ReactNativeTemplate.xcodeproj/project.pbxproj b/ios/ReactNativeTemplate.xcodeproj/project.pbxproj index 0943fff..98bee03 100644 --- a/ios/ReactNativeTemplate.xcodeproj/project.pbxproj +++ b/ios/ReactNativeTemplate.xcodeproj/project.pbxproj @@ -433,7 +433,10 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) DEBUG"; @@ -507,7 +510,10 @@ "-DFOLLY_CFG_NO_COROUTINES=1", "-DFOLLY_HAVE_CLOCK_GETTIME=1", ); - OTHER_LDFLAGS = "$(inherited) "; + OTHER_LDFLAGS = ( + "$(inherited)", + " ", + ); REACT_NATIVE_PATH = "${PODS_ROOT}/../../node_modules/react-native"; SDKROOT = iphoneos; USE_HERMES = true; diff --git a/package.json b/package.json index 19c8343..475ba64 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,6 @@ "react-native-svg": "15.12.1", "react-native-teleport": "^0.3.0", "react-native-unistyles": "3.0.10", - "react-native-vector-icons": "10.2.0", "sonner-native": "0.21.1", "zod": "3.24.4" }, diff --git a/src/modules/Common/features/useRootNavigator.ts b/src/modules/Common/features/useRootNavigator.ts index 9a79301..cb422b6 100644 --- a/src/modules/Common/features/useRootNavigator.ts +++ b/src/modules/Common/features/useRootNavigator.ts @@ -1,12 +1,16 @@ import { DefaultTheme, Theme } from '@react-navigation/native'; +import { useEventEmitter } from 'providers'; +import { useEffect } from 'react'; import { useUnistyles } from 'react-native-unistyles'; -import { useCurrentTheme, useToken } from 'stores'; +import { resetAllStores, useCurrentTheme, useToken } from 'stores'; export const useRootNavigator = () => { const token = useToken(); const currentTheme = useCurrentTheme(); + const eventEmitter = useEventEmitter(); + const { theme } = useUnistyles(); const navigationTheme = { @@ -26,6 +30,16 @@ export const useRootNavigator = () => { }, } satisfies Theme; + useEffect(() => { + const listener = eventEmitter.addListener('LOGOUT', () => { + resetAllStores(); + }); + + return () => { + listener.removeListener('LOGOUT'); + }; + }, []); + return { currentTheme, token, diff --git a/src/navigation/BottomTabBarNavigator.tsx b/src/navigation/BottomTabBarNavigator.tsx index 8cd920a..5beb144 100644 --- a/src/navigation/BottomTabBarNavigator.tsx +++ b/src/navigation/BottomTabBarNavigator.tsx @@ -1,6 +1,6 @@ -import React, { useMemo } from 'react'; +import React from 'react'; import { Text } from 'react-native'; -import { IconName } from 'react-native-vector-icons'; +import { IconName } from '@react-native-vector-icons/icomoon'; import { StyleSheet, useUnistyles } from 'react-native-unistyles'; import { Icon } from 'ui'; import { RouteService, RouteType, Routes } from 'services'; @@ -18,13 +18,10 @@ export const BottomTabBarNavigator: React.FC = () => { const { t } = useTranslation(); - const titles: Record = useMemo( - () => ({ - [Routes.ALERTS_NAVIGATOR]: t('screens.alerts'), - [Routes.PROFILE_NAVIGATOR]: t('screens.account'), - }), - [t], - ); + const titles: Record = { + [Routes.ALERTS_NAVIGATOR]: t('screens.alerts'), + [Routes.PROFILE_NAVIGATOR]: t('screens.account'), + }; const handleLongPress = (routeName: RouteType) => { RouteService.navigate(routeName); diff --git a/src/shared/api/baseQuery.ts b/src/shared/api/baseQuery.ts index 0ddf0b4..2df4d94 100644 --- a/src/shared/api/baseQuery.ts +++ b/src/shared/api/baseQuery.ts @@ -1,5 +1,5 @@ import Config from 'react-native-config'; -import { ExceptionService, ToastService } from 'services'; +import { eventEmitter, ExceptionService, ToastService } from 'services'; import { getAuthStoreInstance, resetAllStores } from 'stores'; import axios from 'axios'; import { Mutex } from 'async-mutex'; @@ -33,6 +33,9 @@ export const baseQuery = createAxiosClient({ ToastService.onDanger({ title: ExceptionService.errorResolver(error), }); + + eventEmitter.emit('LOGOUT'); + resetAllStores(); } finally { release(); diff --git a/src/shared/hooks/index.ts b/src/shared/hooks/index.ts index e07a120..01301eb 100644 --- a/src/shared/hooks/index.ts +++ b/src/shared/hooks/index.ts @@ -5,5 +5,5 @@ export * from './useLatest'; export * from './useAppStateEvent'; export * from './useCombinedRef'; export * from './useDebounce'; -export * from './useTypedRoute'; export * from './useDebug'; +export * from './useTypedRoute'; diff --git a/src/shared/hooks/useTypedRoute.ts b/src/shared/hooks/useTypedRoute.ts index 0408705..73c0acc 100644 --- a/src/shared/hooks/useTypedRoute.ts +++ b/src/shared/hooks/useTypedRoute.ts @@ -1,5 +1,8 @@ -import { RouteProp, useRoute } from '@react-navigation/native'; +import { useRoute, RouteProp } from '@react-navigation/native'; import { RootStackParamList } from 'services'; -export const useTypedRoute = () => - useRoute>(); +export const useTypedRoute = ( + _: T, +): RouteProp => { + return useRoute>(); +}; diff --git a/src/shared/providers/EventEmitterProvider/EventEmitterProvider.tsx b/src/shared/providers/EventEmitterProvider/EventEmitterProvider.tsx index def487f..ea6d278 100644 --- a/src/shared/providers/EventEmitterProvider/EventEmitterProvider.tsx +++ b/src/shared/providers/EventEmitterProvider/EventEmitterProvider.tsx @@ -21,7 +21,7 @@ export const useEventEmitter = () => { const context = useContext(EventContext); if (!context) { - throw new Error('useEventEmiiter must be used within an EventProvider'); + throw new Error('useEventEmitter must be used within an EventProvider'); } return context; diff --git a/src/shared/services/RouteService/models/EventEmitterActions.ts b/src/shared/services/RouteService/models/EventEmitterActions.ts index 692dc7c..9a49835 100644 --- a/src/shared/services/RouteService/models/EventEmitterActions.ts +++ b/src/shared/services/RouteService/models/EventEmitterActions.ts @@ -2,12 +2,14 @@ import { EventEmitter } from 'eventemitter3'; export const EVENT_EMITTER_ACTIONS = { SELECT_COUNTRY_CODE: 'SELECT_COUNTRY_CODE', + LOGOUT: 'LOGOUT', } as const; export type EmitterActionsType = keyof typeof EVENT_EMITTER_ACTIONS; export type EventPayloads = { [EVENT_EMITTER_ACTIONS.SELECT_COUNTRY_CODE]: string; + [EVENT_EMITTER_ACTIONS.LOGOUT]: void; }; export class TypedEventEmitter extends EventEmitter< diff --git a/src/shared/types/react-native-vector-icons.d.ts b/src/shared/types/icomoon.d.ts similarity index 52% rename from src/shared/types/react-native-vector-icons.d.ts rename to src/shared/types/icomoon.d.ts index 7a25695..2f7e0a5 100644 --- a/src/shared/types/react-native-vector-icons.d.ts +++ b/src/shared/types/icomoon.d.ts @@ -1,9 +1,6 @@ /* eslint-disable import/no-unresolved */ import { IconName as BaseName } from 'assets/resources/selection.json'; -import { IconProps } from 'react-native-vector-icons/Icon'; -declare module 'react-native-vector-icons' { +declare module '@react-native-vector-icons/icomoon' { export type IconName = BaseName; - - export type Props = IconProps; } diff --git a/src/shared/ui/Icon/Icon.tsx b/src/shared/ui/Icon/Icon.tsx index 042ba00..06fc834 100644 --- a/src/shared/ui/Icon/Icon.tsx +++ b/src/shared/ui/Icon/Icon.tsx @@ -1,8 +1,8 @@ import React from 'react'; import { withUnistyles } from 'react-native-unistyles'; -import { IconName, Props } from 'react-native-vector-icons'; +import createIconSet, { IconName } from '@react-native-vector-icons/icomoon'; import { ColorsType } from 'themes'; -import createIconSet from '@react-native-vector-icons/icomoon'; +import { ViewProps } from 'react-native'; export const IcomoonConfig = require('../../../assets/resources/selection.json'); @@ -10,7 +10,7 @@ const IcomoonIcon = createIconSet(IcomoonConfig); const DEFAULT_ICON_SIZE = 16; -interface BaseProps extends Props { +interface BaseProps extends ViewProps { name: IconName; size?: number; color?: ColorsType; diff --git a/yarn.lock b/yarn.lock index a9119ee..072f318 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1924,22 +1924,6 @@ __metadata: languageName: node linkType: hard -"@emotion/is-prop-valid@npm:^0.8.2": - version: 0.8.8 - resolution: "@emotion/is-prop-valid@npm:0.8.8" - dependencies: - "@emotion/memoize": "npm:0.7.4" - checksum: 10c0/f6be625f067c7fa56a12a4edaf090715616dc4fc7803c87212831f38c969350107b9709b1be54100e53153b18d9fa068eb4bf4f9ac66a37a8edf1bac9b64e279 - languageName: node - linkType: hard - -"@emotion/memoize@npm:0.7.4": - version: 0.7.4 - resolution: "@emotion/memoize@npm:0.7.4" - checksum: 10c0/b2376548fc147b43afd1ff005a80a1a025bd7eb4fb759fdb23e96e5ff290ee8ba16628a332848d600fb91c3cdc319eee5395fa33d8875e5d5a8c4ce18cddc18e - languageName: node - linkType: hard - "@eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": version: 4.4.1 resolution: "@eslint-community/eslint-utils@npm:4.4.1" @@ -2291,71 +2275,6 @@ __metadata: languageName: node linkType: hard -"@motionone/animation@npm:^10.12.0": - version: 10.18.0 - resolution: "@motionone/animation@npm:10.18.0" - dependencies: - "@motionone/easing": "npm:^10.18.0" - "@motionone/types": "npm:^10.17.1" - "@motionone/utils": "npm:^10.18.0" - tslib: "npm:^2.3.1" - checksum: 10c0/83c01ab8ecf5fae221e5012116c4c49d4473ba88ba22197e1d8c1e39364c5c6b9c5271e57ae716fd21f92314d15c63788c48d0a30872ee8d72337e1d98b46834 - languageName: node - linkType: hard - -"@motionone/dom@npm:10.12.0": - version: 10.12.0 - resolution: "@motionone/dom@npm:10.12.0" - dependencies: - "@motionone/animation": "npm:^10.12.0" - "@motionone/generators": "npm:^10.12.0" - "@motionone/types": "npm:^10.12.0" - "@motionone/utils": "npm:^10.12.0" - hey-listen: "npm:^1.0.8" - tslib: "npm:^2.3.1" - checksum: 10c0/1af6cd8d8518ebbd90d74f15443ad94d7d03bf9e7e1455a5cb6768a53ba8dac6906ca121e9c1f42b8d53a8ab7c19d14e4731c10231b5dc7102628f32659faea2 - languageName: node - linkType: hard - -"@motionone/easing@npm:^10.18.0": - version: 10.18.0 - resolution: "@motionone/easing@npm:10.18.0" - dependencies: - "@motionone/utils": "npm:^10.18.0" - tslib: "npm:^2.3.1" - checksum: 10c0/0adf9b7086b0f569d28886890cc0725a489285f2debfcaf27c1c15dfef5736c9f4207cfda14c71b3275f8163777320cb7ff48ad263c7f4ccd31e12a5afc1a952 - languageName: node - linkType: hard - -"@motionone/generators@npm:^10.12.0": - version: 10.18.0 - resolution: "@motionone/generators@npm:10.18.0" - dependencies: - "@motionone/types": "npm:^10.17.1" - "@motionone/utils": "npm:^10.18.0" - tslib: "npm:^2.3.1" - checksum: 10c0/7ed7dda5ac58cd3e8dd347b5539d242d96e02ee16fef921c8d14295a806e6bc429a15291461ec078977bd5f6162677225addd707ca79f808e65bc3599c45c0e9 - languageName: node - linkType: hard - -"@motionone/types@npm:^10.12.0, @motionone/types@npm:^10.17.1": - version: 10.17.1 - resolution: "@motionone/types@npm:10.17.1" - checksum: 10c0/f7b16cd4f0feda0beac10173afa6de7384722f9f24767f78b7aa90f15b8a89d584073a64387b015a8e015a962fa4b47a8ce23621f47708a08676b12bb0d43bbb - languageName: node - linkType: hard - -"@motionone/utils@npm:^10.12.0, @motionone/utils@npm:^10.18.0": - version: 10.18.0 - resolution: "@motionone/utils@npm:10.18.0" - dependencies: - "@motionone/types": "npm:^10.17.1" - hey-listen: "npm:^1.0.8" - tslib: "npm:^2.3.1" - checksum: 10c0/db57dbb6a131fab36dc1eb4e1f3a4575ca97563221663adce54c138de1e1a9eaf4a4a51ddf99fdab0341112159e0190b35cdeddfdbd08ba3ad1e35886a5324bb - languageName: node - linkType: hard - "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1": version: 5.1.1-v1 resolution: "@nicolo-ribaudo/eslint-scope-5-internals@npm:5.1.1-v1" @@ -3987,7 +3906,6 @@ __metadata: husky: "npm:9.0.11" i18next: "npm:23.15.1" metro-react-native-babel-preset: "npm:^0.77.0" - moti: "npm:^0.30.0" prettier: "npm:3.0.3" react: "npm:19.0.0" react-i18next: "npm:15.0.2" @@ -4008,7 +3926,6 @@ __metadata: react-native-svg-transformer: "npm:^1.5.0" react-native-teleport: "npm:^0.3.0" react-native-unistyles: "npm:3.0.10" - react-native-vector-icons: "npm:10.2.0" sonner-native: "npm:0.21.1" ts-to-zod: "npm:3.8.5" typescript: "npm:5.0.4" @@ -5116,17 +5033,6 @@ __metadata: languageName: node linkType: hard -"cliui@npm:^7.0.2": - version: 7.0.4 - resolution: "cliui@npm:7.0.4" - dependencies: - string-width: "npm:^4.2.0" - strip-ansi: "npm:^6.0.0" - wrap-ansi: "npm:^7.0.0" - checksum: 10c0/6035f5daf7383470cef82b3d3db00bec70afb3423538c50394386ffbbab135e26c3689c41791f911fa71b62d13d3863c712fdd70f0fbdffd938a1e6fd09aac00 - languageName: node - linkType: hard - "cliui@npm:^8.0.1": version: 8.0.1 resolution: "cliui@npm:8.0.1" @@ -6999,36 +6905,6 @@ __metadata: languageName: node linkType: hard -"framer-motion@npm:^6.5.1": - version: 6.5.1 - resolution: "framer-motion@npm:6.5.1" - dependencies: - "@emotion/is-prop-valid": "npm:^0.8.2" - "@motionone/dom": "npm:10.12.0" - framesync: "npm:6.0.1" - hey-listen: "npm:^1.0.8" - popmotion: "npm:11.0.3" - style-value-types: "npm:5.0.0" - tslib: "npm:^2.1.0" - peerDependencies: - react: ">=16.8 || ^17.0.0 || ^18.0.0" - react-dom: ">=16.8 || ^17.0.0 || ^18.0.0" - dependenciesMeta: - "@emotion/is-prop-valid": - optional: true - checksum: 10c0/69d64f7ac878eb5a0d90f1ccbaaee76f7731b276c4369fdce7d283fa92cca35ea05c42ad2da0c6c0ab4bb180b7fa4f511b6928bdb43818f6feaf245531d3df5a - languageName: node - linkType: hard - -"framesync@npm:6.0.1": - version: 6.0.1 - resolution: "framesync@npm:6.0.1" - dependencies: - tslib: "npm:^2.1.0" - checksum: 10c0/ce84ce548a8612be070204b9cf3ce7258acead2d51df05586995340e501d1439dfc1f9402ede921a9c0dde854d80fd46e97c699a3657f8d7abd5bc705553bf2b - languageName: node - linkType: hard - "fresh@npm:0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" @@ -7486,13 +7362,6 @@ __metadata: languageName: node linkType: hard -"hey-listen@npm:^1.0.8": - version: 1.0.8 - resolution: "hey-listen@npm:1.0.8" - checksum: 10c0/38db3028b4756f3d536c0f6a92da53bad577ab649b06dddfd0a4d953f9a46bbc6a7f693c8c5b466a538d6d23dbc469260c848427f0de14198a2bbecbac37b39e - languageName: node - linkType: hard - "hoist-non-react-statics@npm:^3.3.0, hoist-non-react-statics@npm:^3.3.2": version: 3.3.2 resolution: "hoist-non-react-statics@npm:3.3.2" @@ -9395,17 +9264,6 @@ __metadata: languageName: node linkType: hard -"moti@npm:^0.30.0": - version: 0.30.0 - resolution: "moti@npm:0.30.0" - dependencies: - framer-motion: "npm:^6.5.1" - peerDependencies: - react-native-reanimated: "*" - checksum: 10c0/9ef9f8c75cfd126a4d50e6a1cddaac2ef7dc6aefee532843903b34b381b8f5f96ef84458b1cd6d05739dd6032be4f07ebda17b4e33bf2818c860bad6cf524038 - languageName: node - linkType: hard - "ms@npm:2.0.0": version: 2.0.0 resolution: "ms@npm:2.0.0" @@ -10062,18 +9920,6 @@ __metadata: languageName: node linkType: hard -"popmotion@npm:11.0.3": - version: 11.0.3 - resolution: "popmotion@npm:11.0.3" - dependencies: - framesync: "npm:6.0.1" - hey-listen: "npm:^1.0.8" - style-value-types: "npm:5.0.0" - tslib: "npm:^2.1.0" - checksum: 10c0/ed196cf034c199a2ab6095f047924b38e24f386c33a182970ad6e1769002b72adff34a72ba7ab2cf34ff5bbfd711ef4caf2e9843ebb7a5c9cafa27c50e525f70 - languageName: node - linkType: hard - "possible-typed-array-names@npm:^1.0.0": version: 1.1.0 resolution: "possible-typed-array-names@npm:1.1.0" @@ -10205,7 +10051,7 @@ __metadata: languageName: node linkType: hard -"prop-types@npm:^15.7.2, prop-types@npm:^15.8.1": +"prop-types@npm:^15.8.1": version: 15.8.1 resolution: "prop-types@npm:15.8.1" dependencies: @@ -10654,21 +10500,6 @@ __metadata: languageName: node linkType: hard -"react-native-vector-icons@npm:10.2.0": - version: 10.2.0 - resolution: "react-native-vector-icons@npm:10.2.0" - dependencies: - prop-types: "npm:^15.7.2" - yargs: "npm:^16.1.1" - bin: - fa-upgrade.sh: bin/fa-upgrade.sh - fa5-upgrade: bin/fa5-upgrade.sh - fa6-upgrade: bin/fa6-upgrade.sh - generate-icon: bin/generate-icon.js - checksum: 10c0/76a7f327b40b29e567f48a49ebc3ad87b755d4e431d66fec3566dfe5e673084cee9b1663f10903a6572aab31c7bcec45100172afb1d46055dfacbbe46b92b348 - languageName: node - linkType: hard - "react-native@npm:0.79.0": version: 0.79.0 resolution: "react-native@npm:0.79.0" @@ -11820,16 +11651,6 @@ __metadata: languageName: node linkType: hard -"style-value-types@npm:5.0.0": - version: 5.0.0 - resolution: "style-value-types@npm:5.0.0" - dependencies: - hey-listen: "npm:^1.0.8" - tslib: "npm:^2.1.0" - checksum: 10c0/a7b693269d48c0cab73da6c88eade845e71b5f330541a9ccb6a065468739d9bafdeb34f94fb89581931371275846da53e35989218cbc0c2d1a38f127e4d765fd - languageName: node - linkType: hard - "sudo-prompt@npm:^9.0.0": version: 9.2.1 resolution: "sudo-prompt@npm:9.2.1" @@ -12883,13 +12704,6 @@ __metadata: languageName: node linkType: hard -"yargs-parser@npm:^20.2.2": - version: 20.2.9 - resolution: "yargs-parser@npm:20.2.9" - checksum: 10c0/0685a8e58bbfb57fab6aefe03c6da904a59769bd803a722bb098bd5b0f29d274a1357762c7258fb487512811b8063fb5d2824a3415a0a4540598335b3b086c72 - languageName: node - linkType: hard - "yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1" @@ -12916,21 +12730,6 @@ __metadata: languageName: node linkType: hard -"yargs@npm:^16.1.1": - version: 16.2.0 - resolution: "yargs@npm:16.2.0" - dependencies: - cliui: "npm:^7.0.2" - escalade: "npm:^3.1.1" - get-caller-file: "npm:^2.0.5" - require-directory: "npm:^2.1.1" - string-width: "npm:^4.2.0" - y18n: "npm:^5.0.5" - yargs-parser: "npm:^20.2.2" - checksum: 10c0/b1dbfefa679848442454b60053a6c95d62f2d2e21dd28def92b647587f415969173c6e99a0f3bab4f1b67ee8283bf735ebe3544013f09491186ba9e8a9a2b651 - languageName: node - linkType: hard - "yargs@npm:^17.0.0, yargs@npm:^17.6.2": version: 17.7.2 resolution: "yargs@npm:17.7.2"