@croacroa/react-native-template 1.0.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/.github/workflows/ci.yml +187 -184
  2. package/.github/workflows/eas-build.yml +55 -55
  3. package/.github/workflows/eas-update.yml +50 -50
  4. package/CHANGELOG.md +106 -106
  5. package/CONTRIBUTING.md +377 -377
  6. package/README.md +399 -399
  7. package/__tests__/components/snapshots.test.tsx +131 -0
  8. package/__tests__/integration/auth-api.test.tsx +227 -0
  9. package/__tests__/performance/VirtualizedList.perf.test.tsx +362 -0
  10. package/app/(public)/onboarding.tsx +5 -5
  11. package/app.config.ts +45 -2
  12. package/assets/images/.gitkeep +7 -7
  13. package/components/onboarding/OnboardingScreen.tsx +370 -370
  14. package/components/onboarding/index.ts +2 -2
  15. package/components/providers/SuspenseBoundary.tsx +357 -0
  16. package/components/providers/index.ts +13 -0
  17. package/components/ui/Avatar.tsx +316 -316
  18. package/components/ui/Badge.tsx +416 -416
  19. package/components/ui/BottomSheet.tsx +307 -307
  20. package/components/ui/Checkbox.tsx +261 -261
  21. package/components/ui/OptimizedImage.tsx +369 -369
  22. package/components/ui/Select.tsx +240 -240
  23. package/components/ui/VirtualizedList.tsx +285 -0
  24. package/components/ui/index.ts +23 -18
  25. package/constants/config.ts +97 -54
  26. package/docs/adr/001-state-management.md +79 -79
  27. package/docs/adr/002-styling-approach.md +130 -130
  28. package/docs/adr/003-data-fetching.md +155 -155
  29. package/docs/adr/004-auth-adapter-pattern.md +144 -144
  30. package/docs/adr/README.md +78 -78
  31. package/hooks/index.ts +27 -25
  32. package/hooks/useApi.ts +102 -5
  33. package/hooks/useAuth.tsx +82 -0
  34. package/hooks/useBiometrics.ts +295 -295
  35. package/hooks/useDeepLinking.ts +256 -256
  36. package/hooks/useMFA.ts +499 -0
  37. package/hooks/useNotifications.ts +39 -0
  38. package/hooks/useOffline.ts +32 -2
  39. package/hooks/usePerformance.ts +434 -434
  40. package/hooks/useTheme.tsx +76 -0
  41. package/hooks/useUpdates.ts +358 -358
  42. package/i18n/index.ts +194 -77
  43. package/i18n/locales/ar.json +101 -0
  44. package/i18n/locales/de.json +101 -0
  45. package/i18n/locales/en.json +101 -101
  46. package/i18n/locales/es.json +101 -0
  47. package/i18n/locales/fr.json +101 -101
  48. package/jest.config.js +4 -4
  49. package/maestro/README.md +113 -113
  50. package/maestro/config.yaml +35 -35
  51. package/maestro/flows/login.yaml +62 -62
  52. package/maestro/flows/mfa-login.yaml +92 -0
  53. package/maestro/flows/mfa-setup.yaml +86 -0
  54. package/maestro/flows/navigation.yaml +68 -68
  55. package/maestro/flows/offline-conflict.yaml +101 -0
  56. package/maestro/flows/offline-sync.yaml +128 -0
  57. package/maestro/flows/offline.yaml +60 -60
  58. package/maestro/flows/register.yaml +94 -94
  59. package/package.json +175 -170
  60. package/services/analytics.ts +428 -428
  61. package/services/api.ts +340 -340
  62. package/services/authAdapter.ts +333 -333
  63. package/services/backgroundSync.ts +626 -0
  64. package/services/index.ts +54 -22
  65. package/services/security.ts +229 -0
  66. package/tailwind.config.js +47 -47
  67. package/utils/accessibility.ts +446 -446
  68. package/utils/index.ts +52 -43
  69. package/utils/withAccessibility.tsx +272 -0
@@ -1,101 +1,101 @@
1
- {
2
- "common": {
3
- "loading": "Loading...",
4
- "error": "Error",
5
- "success": "Success",
6
- "cancel": "Cancel",
7
- "confirm": "Confirm",
8
- "save": "Save",
9
- "delete": "Delete",
10
- "edit": "Edit",
11
- "close": "Close",
12
- "back": "Back",
13
- "next": "Next",
14
- "done": "Done",
15
- "retry": "Retry",
16
- "search": "Search",
17
- "noResults": "No results found",
18
- "offline": "You are offline",
19
- "online": "Back online"
20
- },
21
- "auth": {
22
- "signIn": "Sign In",
23
- "signUp": "Sign Up",
24
- "signOut": "Sign Out",
25
- "email": "Email",
26
- "password": "Password",
27
- "confirmPassword": "Confirm Password",
28
- "name": "Name",
29
- "forgotPassword": "Forgot Password?",
30
- "resetPassword": "Reset Password",
31
- "noAccount": "Don't have an account?",
32
- "haveAccount": "Already have an account?",
33
- "welcomeBack": "Welcome back!",
34
- "signInToContinue": "Sign in to continue",
35
- "createAccount": "Create Account",
36
- "joinUs": "Join us today",
37
- "enterEmail": "Enter your email",
38
- "enterPassword": "Enter your password",
39
- "enterName": "Enter your name",
40
- "passwordHint": "At least 8 characters",
41
- "invalidCredentials": "Invalid email or password",
42
- "accountCreated": "Account created successfully!",
43
- "sessionExpired": "Session expired. Please sign in again.",
44
- "biometric": {
45
- "title": "Biometric Authentication",
46
- "prompt": "Authenticate to continue",
47
- "fallback": "Use passcode",
48
- "enabled": "Biometric login enabled",
49
- "disabled": "Biometric login disabled",
50
- "notAvailable": "Biometric authentication not available"
51
- }
52
- },
53
- "navigation": {
54
- "home": "Home",
55
- "profile": "Profile",
56
- "settings": "Settings",
57
- "notifications": "Notifications"
58
- },
59
- "profile": {
60
- "title": "Profile",
61
- "editProfile": "Edit Profile",
62
- "changePhoto": "Change Photo",
63
- "personalInfo": "Personal Information",
64
- "memberSince": "Member since {{date}}"
65
- },
66
- "settings": {
67
- "title": "Settings",
68
- "appearance": "Appearance",
69
- "theme": "Theme",
70
- "themeLight": "Light",
71
- "themeDark": "Dark",
72
- "themeSystem": "System",
73
- "language": "Language",
74
- "notifications": "Notifications",
75
- "pushNotifications": "Push Notifications",
76
- "emailNotifications": "Email Notifications",
77
- "security": "Security",
78
- "biometricAuth": "Biometric Authentication",
79
- "changePassword": "Change Password",
80
- "privacy": "Privacy Policy",
81
- "terms": "Terms of Service",
82
- "about": "About",
83
- "version": "Version",
84
- "deleteAccount": "Delete Account"
85
- },
86
- "errors": {
87
- "generic": "Something went wrong",
88
- "network": "Network error. Please check your connection.",
89
- "timeout": "Request timed out. Please try again.",
90
- "unauthorized": "You are not authorized to perform this action.",
91
- "notFound": "Resource not found.",
92
- "validation": "Please check your input and try again."
93
- },
94
- "validation": {
95
- "required": "This field is required",
96
- "email": "Please enter a valid email",
97
- "passwordMin": "Password must be at least 8 characters",
98
- "passwordMatch": "Passwords do not match",
99
- "nameMin": "Name must be at least 2 characters"
100
- }
101
- }
1
+ {
2
+ "common": {
3
+ "loading": "Loading...",
4
+ "error": "Error",
5
+ "success": "Success",
6
+ "cancel": "Cancel",
7
+ "confirm": "Confirm",
8
+ "save": "Save",
9
+ "delete": "Delete",
10
+ "edit": "Edit",
11
+ "close": "Close",
12
+ "back": "Back",
13
+ "next": "Next",
14
+ "done": "Done",
15
+ "retry": "Retry",
16
+ "search": "Search",
17
+ "noResults": "No results found",
18
+ "offline": "You are offline",
19
+ "online": "Back online"
20
+ },
21
+ "auth": {
22
+ "signIn": "Sign In",
23
+ "signUp": "Sign Up",
24
+ "signOut": "Sign Out",
25
+ "email": "Email",
26
+ "password": "Password",
27
+ "confirmPassword": "Confirm Password",
28
+ "name": "Name",
29
+ "forgotPassword": "Forgot Password?",
30
+ "resetPassword": "Reset Password",
31
+ "noAccount": "Don't have an account?",
32
+ "haveAccount": "Already have an account?",
33
+ "welcomeBack": "Welcome back!",
34
+ "signInToContinue": "Sign in to continue",
35
+ "createAccount": "Create Account",
36
+ "joinUs": "Join us today",
37
+ "enterEmail": "Enter your email",
38
+ "enterPassword": "Enter your password",
39
+ "enterName": "Enter your name",
40
+ "passwordHint": "At least 8 characters",
41
+ "invalidCredentials": "Invalid email or password",
42
+ "accountCreated": "Account created successfully!",
43
+ "sessionExpired": "Session expired. Please sign in again.",
44
+ "biometric": {
45
+ "title": "Biometric Authentication",
46
+ "prompt": "Authenticate to continue",
47
+ "fallback": "Use passcode",
48
+ "enabled": "Biometric login enabled",
49
+ "disabled": "Biometric login disabled",
50
+ "notAvailable": "Biometric authentication not available"
51
+ }
52
+ },
53
+ "navigation": {
54
+ "home": "Home",
55
+ "profile": "Profile",
56
+ "settings": "Settings",
57
+ "notifications": "Notifications"
58
+ },
59
+ "profile": {
60
+ "title": "Profile",
61
+ "editProfile": "Edit Profile",
62
+ "changePhoto": "Change Photo",
63
+ "personalInfo": "Personal Information",
64
+ "memberSince": "Member since {{date}}"
65
+ },
66
+ "settings": {
67
+ "title": "Settings",
68
+ "appearance": "Appearance",
69
+ "theme": "Theme",
70
+ "themeLight": "Light",
71
+ "themeDark": "Dark",
72
+ "themeSystem": "System",
73
+ "language": "Language",
74
+ "notifications": "Notifications",
75
+ "pushNotifications": "Push Notifications",
76
+ "emailNotifications": "Email Notifications",
77
+ "security": "Security",
78
+ "biometricAuth": "Biometric Authentication",
79
+ "changePassword": "Change Password",
80
+ "privacy": "Privacy Policy",
81
+ "terms": "Terms of Service",
82
+ "about": "About",
83
+ "version": "Version",
84
+ "deleteAccount": "Delete Account"
85
+ },
86
+ "errors": {
87
+ "generic": "Something went wrong",
88
+ "network": "Network error. Please check your connection.",
89
+ "timeout": "Request timed out. Please try again.",
90
+ "unauthorized": "You are not authorized to perform this action.",
91
+ "notFound": "Resource not found.",
92
+ "validation": "Please check your input and try again."
93
+ },
94
+ "validation": {
95
+ "required": "This field is required",
96
+ "email": "Please enter a valid email",
97
+ "passwordMin": "Password must be at least 8 characters",
98
+ "passwordMatch": "Passwords do not match",
99
+ "nameMin": "Name must be at least 2 characters"
100
+ }
101
+ }
@@ -0,0 +1,101 @@
1
+ {
2
+ "common": {
3
+ "loading": "Cargando...",
4
+ "error": "Error",
5
+ "success": "Correcto",
6
+ "cancel": "Cancelar",
7
+ "confirm": "Confirmar",
8
+ "save": "Guardar",
9
+ "delete": "Eliminar",
10
+ "edit": "Editar",
11
+ "close": "Cerrar",
12
+ "back": "Atrás",
13
+ "next": "Siguiente",
14
+ "done": "Hecho",
15
+ "retry": "Reintentar",
16
+ "search": "Buscar",
17
+ "noResults": "No se encontraron resultados",
18
+ "offline": "Estás sin conexión",
19
+ "online": "Conexión restablecida"
20
+ },
21
+ "auth": {
22
+ "signIn": "Iniciar sesión",
23
+ "signUp": "Registrarse",
24
+ "signOut": "Cerrar sesión",
25
+ "email": "Correo electrónico",
26
+ "password": "Contraseña",
27
+ "confirmPassword": "Confirmar contraseña",
28
+ "name": "Nombre",
29
+ "forgotPassword": "¿Olvidaste tu contraseña?",
30
+ "resetPassword": "Restablecer contraseña",
31
+ "noAccount": "¿No tienes una cuenta?",
32
+ "haveAccount": "¿Ya tienes una cuenta?",
33
+ "welcomeBack": "¡Bienvenido de nuevo!",
34
+ "signInToContinue": "Inicia sesión para continuar",
35
+ "createAccount": "Crear cuenta",
36
+ "joinUs": "Únete hoy",
37
+ "enterEmail": "Ingresa tu correo electrónico",
38
+ "enterPassword": "Ingresa tu contraseña",
39
+ "enterName": "Ingresa tu nombre",
40
+ "passwordHint": "Mínimo 8 caracteres",
41
+ "invalidCredentials": "Correo o contraseña inválidos",
42
+ "accountCreated": "¡Cuenta creada exitosamente!",
43
+ "sessionExpired": "Sesión expirada. Por favor inicia sesión nuevamente.",
44
+ "biometric": {
45
+ "title": "Autenticación biométrica",
46
+ "prompt": "Autentícate para continuar",
47
+ "fallback": "Usar código de acceso",
48
+ "enabled": "Inicio de sesión biométrico activado",
49
+ "disabled": "Inicio de sesión biométrico desactivado",
50
+ "notAvailable": "Autenticación biométrica no disponible"
51
+ }
52
+ },
53
+ "navigation": {
54
+ "home": "Inicio",
55
+ "profile": "Perfil",
56
+ "settings": "Configuración",
57
+ "notifications": "Notificaciones"
58
+ },
59
+ "profile": {
60
+ "title": "Perfil",
61
+ "editProfile": "Editar perfil",
62
+ "changePhoto": "Cambiar foto",
63
+ "personalInfo": "Información personal",
64
+ "memberSince": "Miembro desde {{date}}"
65
+ },
66
+ "settings": {
67
+ "title": "Configuración",
68
+ "appearance": "Apariencia",
69
+ "theme": "Tema",
70
+ "themeLight": "Claro",
71
+ "themeDark": "Oscuro",
72
+ "themeSystem": "Sistema",
73
+ "language": "Idioma",
74
+ "notifications": "Notificaciones",
75
+ "pushNotifications": "Notificaciones push",
76
+ "emailNotifications": "Notificaciones por correo",
77
+ "security": "Seguridad",
78
+ "biometricAuth": "Autenticación biométrica",
79
+ "changePassword": "Cambiar contraseña",
80
+ "privacy": "Política de privacidad",
81
+ "terms": "Términos de servicio",
82
+ "about": "Acerca de",
83
+ "version": "Versión",
84
+ "deleteAccount": "Eliminar cuenta"
85
+ },
86
+ "errors": {
87
+ "generic": "Algo salió mal",
88
+ "network": "Error de red. Por favor verifica tu conexión.",
89
+ "timeout": "Tiempo de espera agotado. Por favor intenta de nuevo.",
90
+ "unauthorized": "No estás autorizado para realizar esta acción.",
91
+ "notFound": "Recurso no encontrado.",
92
+ "validation": "Por favor verifica tus datos e intenta de nuevo."
93
+ },
94
+ "validation": {
95
+ "required": "Este campo es obligatorio",
96
+ "email": "Por favor ingresa un correo válido",
97
+ "passwordMin": "La contraseña debe tener al menos 8 caracteres",
98
+ "passwordMatch": "Las contraseñas no coinciden",
99
+ "nameMin": "El nombre debe tener al menos 2 caracteres"
100
+ }
101
+ }
@@ -1,101 +1,101 @@
1
- {
2
- "common": {
3
- "loading": "Chargement...",
4
- "error": "Erreur",
5
- "success": "Succès",
6
- "cancel": "Annuler",
7
- "confirm": "Confirmer",
8
- "save": "Enregistrer",
9
- "delete": "Supprimer",
10
- "edit": "Modifier",
11
- "close": "Fermer",
12
- "back": "Retour",
13
- "next": "Suivant",
14
- "done": "Terminé",
15
- "retry": "Réessayer",
16
- "search": "Rechercher",
17
- "noResults": "Aucun résultat trouvé",
18
- "offline": "Vous êtes hors ligne",
19
- "online": "De retour en ligne"
20
- },
21
- "auth": {
22
- "signIn": "Se connecter",
23
- "signUp": "S'inscrire",
24
- "signOut": "Se déconnecter",
25
- "email": "Email",
26
- "password": "Mot de passe",
27
- "confirmPassword": "Confirmer le mot de passe",
28
- "name": "Nom",
29
- "forgotPassword": "Mot de passe oublié ?",
30
- "resetPassword": "Réinitialiser le mot de passe",
31
- "noAccount": "Vous n'avez pas de compte ?",
32
- "haveAccount": "Vous avez déjà un compte ?",
33
- "welcomeBack": "Bon retour !",
34
- "signInToContinue": "Connectez-vous pour continuer",
35
- "createAccount": "Créer un compte",
36
- "joinUs": "Rejoignez-nous",
37
- "enterEmail": "Entrez votre email",
38
- "enterPassword": "Entrez votre mot de passe",
39
- "enterName": "Entrez votre nom",
40
- "passwordHint": "Au moins 8 caractères",
41
- "invalidCredentials": "Email ou mot de passe invalide",
42
- "accountCreated": "Compte créé avec succès !",
43
- "sessionExpired": "Session expirée. Veuillez vous reconnecter.",
44
- "biometric": {
45
- "title": "Authentification biométrique",
46
- "prompt": "Authentifiez-vous pour continuer",
47
- "fallback": "Utiliser le code",
48
- "enabled": "Connexion biométrique activée",
49
- "disabled": "Connexion biométrique désactivée",
50
- "notAvailable": "Authentification biométrique non disponible"
51
- }
52
- },
53
- "navigation": {
54
- "home": "Accueil",
55
- "profile": "Profil",
56
- "settings": "Paramètres",
57
- "notifications": "Notifications"
58
- },
59
- "profile": {
60
- "title": "Profil",
61
- "editProfile": "Modifier le profil",
62
- "changePhoto": "Changer la photo",
63
- "personalInfo": "Informations personnelles",
64
- "memberSince": "Membre depuis {{date}}"
65
- },
66
- "settings": {
67
- "title": "Paramètres",
68
- "appearance": "Apparence",
69
- "theme": "Thème",
70
- "themeLight": "Clair",
71
- "themeDark": "Sombre",
72
- "themeSystem": "Système",
73
- "language": "Langue",
74
- "notifications": "Notifications",
75
- "pushNotifications": "Notifications push",
76
- "emailNotifications": "Notifications par email",
77
- "security": "Sécurité",
78
- "biometricAuth": "Authentification biométrique",
79
- "changePassword": "Changer le mot de passe",
80
- "privacy": "Politique de confidentialité",
81
- "terms": "Conditions d'utilisation",
82
- "about": "À propos",
83
- "version": "Version",
84
- "deleteAccount": "Supprimer le compte"
85
- },
86
- "errors": {
87
- "generic": "Une erreur s'est produite",
88
- "network": "Erreur réseau. Vérifiez votre connexion.",
89
- "timeout": "Délai dépassé. Veuillez réessayer.",
90
- "unauthorized": "Vous n'êtes pas autorisé à effectuer cette action.",
91
- "notFound": "Ressource introuvable.",
92
- "validation": "Veuillez vérifier vos informations et réessayer."
93
- },
94
- "validation": {
95
- "required": "Ce champ est requis",
96
- "email": "Veuillez entrer un email valide",
97
- "passwordMin": "Le mot de passe doit contenir au moins 8 caractères",
98
- "passwordMatch": "Les mots de passe ne correspondent pas",
99
- "nameMin": "Le nom doit contenir au moins 2 caractères"
100
- }
101
- }
1
+ {
2
+ "common": {
3
+ "loading": "Chargement...",
4
+ "error": "Erreur",
5
+ "success": "Succès",
6
+ "cancel": "Annuler",
7
+ "confirm": "Confirmer",
8
+ "save": "Enregistrer",
9
+ "delete": "Supprimer",
10
+ "edit": "Modifier",
11
+ "close": "Fermer",
12
+ "back": "Retour",
13
+ "next": "Suivant",
14
+ "done": "Terminé",
15
+ "retry": "Réessayer",
16
+ "search": "Rechercher",
17
+ "noResults": "Aucun résultat trouvé",
18
+ "offline": "Vous êtes hors ligne",
19
+ "online": "De retour en ligne"
20
+ },
21
+ "auth": {
22
+ "signIn": "Se connecter",
23
+ "signUp": "S'inscrire",
24
+ "signOut": "Se déconnecter",
25
+ "email": "Email",
26
+ "password": "Mot de passe",
27
+ "confirmPassword": "Confirmer le mot de passe",
28
+ "name": "Nom",
29
+ "forgotPassword": "Mot de passe oublié ?",
30
+ "resetPassword": "Réinitialiser le mot de passe",
31
+ "noAccount": "Vous n'avez pas de compte ?",
32
+ "haveAccount": "Vous avez déjà un compte ?",
33
+ "welcomeBack": "Bon retour !",
34
+ "signInToContinue": "Connectez-vous pour continuer",
35
+ "createAccount": "Créer un compte",
36
+ "joinUs": "Rejoignez-nous",
37
+ "enterEmail": "Entrez votre email",
38
+ "enterPassword": "Entrez votre mot de passe",
39
+ "enterName": "Entrez votre nom",
40
+ "passwordHint": "Au moins 8 caractères",
41
+ "invalidCredentials": "Email ou mot de passe invalide",
42
+ "accountCreated": "Compte créé avec succès !",
43
+ "sessionExpired": "Session expirée. Veuillez vous reconnecter.",
44
+ "biometric": {
45
+ "title": "Authentification biométrique",
46
+ "prompt": "Authentifiez-vous pour continuer",
47
+ "fallback": "Utiliser le code",
48
+ "enabled": "Connexion biométrique activée",
49
+ "disabled": "Connexion biométrique désactivée",
50
+ "notAvailable": "Authentification biométrique non disponible"
51
+ }
52
+ },
53
+ "navigation": {
54
+ "home": "Accueil",
55
+ "profile": "Profil",
56
+ "settings": "Paramètres",
57
+ "notifications": "Notifications"
58
+ },
59
+ "profile": {
60
+ "title": "Profil",
61
+ "editProfile": "Modifier le profil",
62
+ "changePhoto": "Changer la photo",
63
+ "personalInfo": "Informations personnelles",
64
+ "memberSince": "Membre depuis {{date}}"
65
+ },
66
+ "settings": {
67
+ "title": "Paramètres",
68
+ "appearance": "Apparence",
69
+ "theme": "Thème",
70
+ "themeLight": "Clair",
71
+ "themeDark": "Sombre",
72
+ "themeSystem": "Système",
73
+ "language": "Langue",
74
+ "notifications": "Notifications",
75
+ "pushNotifications": "Notifications push",
76
+ "emailNotifications": "Notifications par email",
77
+ "security": "Sécurité",
78
+ "biometricAuth": "Authentification biométrique",
79
+ "changePassword": "Changer le mot de passe",
80
+ "privacy": "Politique de confidentialité",
81
+ "terms": "Conditions d'utilisation",
82
+ "about": "À propos",
83
+ "version": "Version",
84
+ "deleteAccount": "Supprimer le compte"
85
+ },
86
+ "errors": {
87
+ "generic": "Une erreur s'est produite",
88
+ "network": "Erreur réseau. Vérifiez votre connexion.",
89
+ "timeout": "Délai dépassé. Veuillez réessayer.",
90
+ "unauthorized": "Vous n'êtes pas autorisé à effectuer cette action.",
91
+ "notFound": "Ressource introuvable.",
92
+ "validation": "Veuillez vérifier vos informations et réessayer."
93
+ },
94
+ "validation": {
95
+ "required": "Ce champ est requis",
96
+ "email": "Veuillez entrer un email valide",
97
+ "passwordMin": "Le mot de passe doit contenir au moins 8 caractères",
98
+ "passwordMatch": "Les mots de passe ne correspondent pas",
99
+ "nameMin": "Le nom doit contenir au moins 2 caractères"
100
+ }
101
+ }
package/jest.config.js CHANGED
@@ -21,10 +21,10 @@ module.exports = {
21
21
  ],
22
22
  coverageThreshold: {
23
23
  global: {
24
- branches: 50,
25
- functions: 50,
26
- lines: 50,
27
- statements: 50,
24
+ branches: 70,
25
+ functions: 70,
26
+ lines: 70,
27
+ statements: 70,
28
28
  },
29
29
  },
30
30
  testPathIgnorePatterns: ["/node_modules/", "/.expo/"],