From c4f4956ef308ffe6bd864dce49599ba152def1ea Mon Sep 17 00:00:00 2001 From: Jonas Hungershausen Date: Fri, 18 Aug 2023 15:57:17 +0200 Subject: [PATCH 1/6] chore: make SDK errors easier to debug --- src/components/Routes/Callback.tsx | 6 +- src/components/Routes/Home.tsx | 17 +++--- src/components/Routes/Login.tsx | 16 ++++- src/components/Routes/Registration.tsx | 16 +++-- src/components/Routes/Settings.tsx | 4 +- src/components/Routes/Verification.tsx | 3 +- src/helpers/axios.tsx | 30 +++++++++- src/helpers/form.tsx | 83 +++++++++++++++++++------- 8 files changed, 131 insertions(+), 44 deletions(-) diff --git a/src/components/Routes/Callback.tsx b/src/components/Routes/Callback.tsx index a8b4fa4..0f85474 100644 --- a/src/components/Routes/Callback.tsx +++ b/src/components/Routes/Callback.tsx @@ -1,12 +1,14 @@ import { StackScreenProps } from "@react-navigation/stack" import * as WebBrowser from "expo-web-browser" -import React from "react" +import React, { useEffect } from "react" import { RootStackParamList } from "../Navigation" type Props = StackScreenProps +// This is the route that the user is redirected to after they have logged in with their OIDC (SSO) account. +// It will handle the completion of the auth request const Callback = (props: Props) => { - React.useEffect(() => { + useEffect(() => { WebBrowser.maybeCompleteAuthSession({ skipRedirectCheck: false, }) diff --git a/src/components/Routes/Home.tsx b/src/components/Routes/Home.tsx index 6801254..02f28dd 100644 --- a/src/components/Routes/Home.tsx +++ b/src/components/Routes/Home.tsx @@ -20,10 +20,9 @@ const Home = () => { return null } - // Get the name, or if it does not exist in the traits, use the - // identity's ID - const { name: { first = String(session.identity.id) } = {} } = session - .identity.traits as any + const traits = session.identity.traits + // Use the first name, the email, or the ID as the name + const first = traits.name?.first || traits.email || session.identity.id return ( @@ -34,16 +33,14 @@ const Home = () => { Hello, nice to have you! You signed up with this data: - - {JSON.stringify(session.identity.traits || "{}", null, 2)} - + {JSON.stringify(traits || "{}", null, 2)} - You are signed in using an ORY Kratos Session Token: + You are signed in using an Ory Session Token: {sessionToken} - This app makes REST requests to ORY Kratos' Public API to validate and - decode the ORY Kratos Session payload: + This app makes REST requests to Ory Identities' Public API to validate + and decode the Ory Session payload: {JSON.stringify(session || "{}", null, 2)} diff --git a/src/components/Routes/Login.tsx b/src/components/Routes/Login.tsx index 412e898..e83c2ce 100644 --- a/src/components/Routes/Login.tsx +++ b/src/components/Routes/Login.tsx @@ -5,6 +5,7 @@ import { StackScreenProps } from "@react-navigation/stack" import React, { useContext, useState } from "react" import { SessionContext } from "../../helpers/auth" +import { logSDKError } from "../../helpers/axios" import { handleFormSubmitError } from "../../helpers/form" import { newOrySdk } from "../../helpers/sdk" import { AuthContext } from "../AuthProvider" @@ -16,6 +17,7 @@ import { ProjectContext } from "../ProjectProvider" import AuthSubTitle from "../Styled/AuthSubTitle" import NavigationCard from "../Styled/NavigationCard" import StyledCard from "../Styled/StyledCard" +import * as AuthSession from "expo-auth-session" type Props = StackScreenProps @@ -30,17 +32,25 @@ const Login = ({ navigation, route }: Props) => { aal: route.params.aal, refresh: route.params.refresh, xSessionToken: sessionToken, - returnTo: "http://localhost:19006/Callback", + // If you do use social sign in, please add the following URLs to your allowed return to URLs. + // If you the app is running on an emulator or physical device: exp://localhost:8081 + // If you are using the web version: http://localhost:19006 (or whatever port you are using) + // If that does not work, please see the documentation of makeRedirectURI for more information: https://docs.expo.dev/versions/latest/sdk/auth-session/#authsessionmakeredirecturioptions + // If you don't use Social sign in, you can comment out the following line. + returnTo: AuthSession.makeRedirectUri({ + preferLocalhost: true, + path: "/Callback", + }), returnSessionTokenExchangeCode: true, }) .then(({ data: f }) => setFlow(f)) - .catch(console.error) + .catch(logSDKError) const refetchFlow = () => newOrySdk(project) .getLoginFlow({ id: flow!.id }) .then(({ data: f }) => setFlow({ ...flow, ...f })) // merging ensures we don't lose the code - .catch(console.error) + .catch(logSDKError) // When the component is mounted, we initialize a new use login flow: useFocusEffect( diff --git a/src/components/Routes/Registration.tsx b/src/components/Routes/Registration.tsx index 561fefd..bcfc54f 100644 --- a/src/components/Routes/Registration.tsx +++ b/src/components/Routes/Registration.tsx @@ -16,9 +16,15 @@ import { ProjectContext } from "../ProjectProvider" import AuthSubTitle from "../Styled/AuthSubTitle" import NavigationCard from "../Styled/NavigationCard" import StyledCard from "../Styled/StyledCard" +import * as AuthSession from "expo-auth-session" +import { logSDKError } from "../../helpers/axios" type Props = StackScreenProps +const redirectUri = AuthSession.makeRedirectUri({ + preferLocalhost: true, + path: "/Callback", +}) const Registration = ({ navigation }: Props) => { const [flow, setFlow] = useState(undefined) const { project } = useContext(ProjectContext) @@ -27,7 +33,7 @@ const Registration = ({ navigation }: Props) => { const initializeFlow = () => newOrySdk(project) .createNativeRegistrationFlow({ - returnTo: "http://localhost:19006/Callback", + returnTo: redirectUri, returnSessionTokenExchangeCode: true, }) // The flow was initialized successfully, let's set the form data: @@ -35,7 +41,7 @@ const Registration = ({ navigation }: Props) => { setFlow(flow) console.log("Setting registration flow", flow) }) - .catch(console.error) + .catch(logSDKError) // When the component is mounted, we initialize a new use login flow: useFocusEffect( @@ -54,7 +60,7 @@ const Registration = ({ navigation }: Props) => { newOrySdk(project) .getRegistrationFlow({ id: flow!.id }) .then(({ data: f }) => setFlow({ ...flow, ...f })) // merging ensures we don't lose the code - .catch(console.error) + .catch(logSDKError) const setSessionAndRedirect = (session: SessionContext) => { setSession(session) @@ -77,12 +83,12 @@ const Registration = ({ navigation }: Props) => { updateRegistrationFlowBody: payload, }) .then(({ data }) => { - // ORY Kratos can be configured in such a way that it requires a login after + // Ory Kratos can be configured in such a way that it requires a login after // registration. You could handle that case by navigating to the Login screen // but for simplicity we'll just print an error here: if (!data.session_token || !data.session) { const err = new Error( - "It looks like you configured ORY Kratos to not issue a session automatically after registration. This edge-case is currently not supported in this example app. You can find more information on enabling this feature here: https://www.ory.sh/kratos/docs/next/self-service/flows/user-registration#successful-registration", + "It looks like you configured Ory Idnetities to not issue a session automatically after registration. This edge-case is currently not supported in this example app. You can find more information on enabling this feature here: https://www.ory.sh/kratos/docs/next/self-service/flows/user-registration#successful-registration", ) return Promise.reject(err) } diff --git a/src/components/Routes/Settings.tsx b/src/components/Routes/Settings.tsx index 726ffe7..083cb79 100644 --- a/src/components/Routes/Settings.tsx +++ b/src/components/Routes/Settings.tsx @@ -17,7 +17,7 @@ import { SelfServiceFlow } from "../Ory/Ui" import { ProjectContext } from "../ProjectProvider" import StyledCard from "../Styled/StyledCard" import StyledText from "../Styled/StyledText" -import { SessionContext } from "../../helpers/auth" +import { logSDKError } from "../../helpers/axios" const CardTitle = styled.View` margin-bottom: 15px; @@ -36,7 +36,7 @@ const Settings = () => { .then(({ data: flow }) => { setFlow(flow) }) - .catch(console.error) + .catch(logSDKError) useEffect(() => { if (sessionToken) { diff --git a/src/components/Routes/Verification.tsx b/src/components/Routes/Verification.tsx index b38c6e4..4a36a27 100644 --- a/src/components/Routes/Verification.tsx +++ b/src/components/Routes/Verification.tsx @@ -13,6 +13,7 @@ import AuthSubTitle from "../Styled/AuthSubTitle" import NavigationCard from "../Styled/NavigationCard" import StyledButton from "../Styled/StyledButton" import StyledCard from "../Styled/StyledCard" +import { logSDKError } from "../../helpers/axios" type Props = StackScreenProps @@ -27,7 +28,7 @@ export default function Verification({ navigation, route }: Props) { .then(({ data: flow }) => { setConfig(flow) }) - .catch(console.error) + .catch(logSDKError) const fetchFlow = (id: string) => newOrySdk(project) diff --git a/src/helpers/axios.tsx b/src/helpers/axios.tsx index 82935bd..174352b 100644 --- a/src/helpers/axios.tsx +++ b/src/helpers/axios.tsx @@ -1,6 +1,6 @@ // A small which adds retries to axios -import { AxiosInstance } from "axios" +import { AxiosError, AxiosInstance } from "axios" export const resilience = (axios: AxiosInstance) => { axios.interceptors.response.use( @@ -59,3 +59,31 @@ export const resilience = (axios: AxiosInstance) => { }, ) } + +// TODO: remove once we upgrade axios +export function isAxiosError(e: any, status?: number): e is AxiosError { + return !!e?.isAxiosError && (!status || e.response?.status === status) +} +export function logSDKError(e: unknown): void { + if (!isAxiosError(e)) { + console.error("Something went wrong", JSON.stringify(e, null, 2)) + return + } + const data = e.response?.data + + let message = undefined + switch (data.error.id) { + case "self_service_flow_return_to_forbidden": + message = + "Your project does not allow to return to the app. Please add the URL to the allowed_return_to URLs." + break + } + + console.error( + message || data.error.message || "Something went wrong", + "\n", + "error details:", + JSON.stringify(data.error, null, 2), + ) + return +} diff --git a/src/helpers/form.tsx b/src/helpers/form.tsx index 4403ea9..aa0abf8 100644 --- a/src/helpers/form.tsx +++ b/src/helpers/form.tsx @@ -1,7 +1,9 @@ import { + ErrorBrowserLocationChangeRequired, FrontendApiExchangeSessionTokenRequest, GenericError, LoginFlow, + RecoveryFlow, RegistrationFlow, UiNode, UiNodeAnchorAttributes, @@ -9,12 +11,16 @@ import { UiNodeImageAttributes, UiNodeInputAttributes, UiNodeTextAttributes, + VerificationFlow, } from "@ory/client" -import { showMessage } from "react-native-flash-message" +import { AxiosError } from "axios" import * as WebBrowser from "expo-web-browser" +import { showMessage } from "react-native-flash-message" import { SessionContext } from "./auth" import { newOrySdk } from "./sdk" -import { AxiosError } from "axios" +import * as AuthSession from "expo-auth-session" + +type Flow = LoginFlow | RegistrationFlow | VerificationFlow | RecoveryFlow export function camelize(str: string) { return str.replace(/_([a-z])/g, (g) => g[1].toUpperCase()) as keyof T @@ -75,13 +81,24 @@ export const getNodeTitle = ({ attributes, meta }: UiNode): string => { return "" } -export function handleFlowInitError(err: AxiosError) { - return +function isErrorGeneric(data: unknown): data is { error: GenericError } { + return ( + typeof data === "object" && + data !== null && + "error" in data && + typeof data.error === "object" + ) +} + +function isRedirectBrowserToError( + data: unknown, +): data is ErrorBrowserLocationChangeRequired { + return ( + typeof data === "object" && data !== null && "redirect_browser_to" in data + ) } -export function handleFormSubmitError< - T extends RegistrationFlow | LoginFlow | undefined, ->( +export function handleFormSubmitError( flow: T, setFlow: (p: T) => void, initializeFlow: () => void, @@ -93,8 +110,8 @@ export function handleFormSubmitError< if (err.response) { switch (err.response.status) { case 400: - if (typeof err.response.data.error === "object") { - const ge: GenericError = err.response.data + if (isErrorGeneric(err.response.data)) { + const ge = err.response.data.error showMessage({ message: `${ge.message}: ${ge.reason}`, type: "danger", @@ -103,14 +120,17 @@ export function handleFormSubmitError< return Promise.resolve() } - console.debug("Form validation failed:", err.response.data) + console.debug( + "Form validation failed:", + JSON.stringify(err.response.data), + ) setFlow(err.response.data) return Promise.resolve() case 404: case 410: // This happens when the flow is, for example, expired or was deleted. // We simply re-initialize the flow if that happens! - console.debug("Flow could not be found, reloading page.") + console.debug("Flow could not be found, re-initializing the flow.") initializeFlow() return Promise.resolve() case 403: @@ -127,7 +147,7 @@ export function handleFormSubmitError< // This happens when the privileged session is expired but the user tried // to modify a privileged field (e.g. change the password). console.warn( - "The server indicated that this action is not allowed for you. The most likely cause of that is that you modified a privileged field (e.g. your password) but your ORY Kratos Login Session is too old.", + "The server indicated that this action is not allowed for you. The most likely cause of that is that you modified a privileged field (e.g. your password) but your Ory Identities Login Session is too old.", ) showMessage({ message: "Please re-authenticate before making these changes.", @@ -136,12 +156,21 @@ export function handleFormSubmitError< logout() return Promise.resolve() case 422: - handleRedirectBrowserTo( - err.response.data.redirect_browser_to, - flow, - setSession, - refetchFlow, + console.log( + "The server responded with a 422 error, which indicates that to complete this action, the user needs to fulfil additional steps.", + JSON.stringify(err.response.data, null, 2), ) + if ( + isRedirectBrowserToError(err.response.data) && + err.response.data.redirect_browser_to + ) { + handleRedirectBrowserTo( + err.response.data.redirect_browser_to, + flow as any, + setSession, + refetchFlow, + ) + } return Promise.resolve() } } @@ -168,14 +197,28 @@ async function handleRedirectBrowserTo( const result = await WebBrowser.openAuthSessionAsync( url, - "http://localhost:19006/Callback", + AuthSession.makeRedirectUri({ + preferLocalhost: true, + path: "/Callback", + }), ) if (result.type == "success") { // We can fetch the session token now! const initCode = flow?.session_token_exchange_code + if (!initCode) { + console.log( + "The code from the flow is missing, refetching flow. This is likely due to an error in the flow.", + JSON.stringify(flow), + ) + return refetchFlow() + } const returnToCode = new URL(result.url).searchParams.get("code") - if (!initCode || !returnToCode) { - console.log("code missing, refetching flow") + if (!returnToCode) { + console.log( + "The provider did not include a code, refetching flow. This is likely due to an error in the flow.", + "The url was: ", + result.url, + ) return refetchFlow() } fetchToken({ initCode, returnToCode }) From 0df9c0ed36621c1fcee81c683e20d35a673758b3 Mon Sep 17 00:00:00 2001 From: Jonas Hungershausen Date: Fri, 18 Aug 2023 16:09:41 +0200 Subject: [PATCH 2/6] chore: ORY => Ory --- README.md | 10 +++++----- app.config.js | 2 +- app.json | 4 ++-- src/components/Routes/Registration.tsx | 14 +++++++++----- src/helpers/sdk.tsx | 2 +- 5 files changed, 18 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 282174d..24dab76 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ -# ORY Kratos React Native Self-Service UI Reference +# Ory Kratos React Native Self-Service UI Reference This is an exemplary Self Service UI for -[ORY Kratos](https://github.com/ory/kratos) Self Service features: +[Ory Kratos](https://github.com/ory/kratos) Self Service features: - Registration - Login @@ -20,12 +20,12 @@ There is an excellent write-up available on implementing [Mobile Login with Username / Email and Password in React Native](https://www.ory.sh/react-native-authentication-login-signup/) but if you want to go ahead and just try it out, do the following: -1. Run the [ORY Kratos quickstart](http://ory.sh/docs/kratos/quickstart) on your +1. Run the [Ory Kratos quickstart](http://ory.sh/docs/kratos/quickstart) on your local machine. -1. Use [`ngrok`](http://ngrok.com) to expose the ORY Kratos public port to the +1. Use [`ngrok`](http://ngrok.com) to expose the Ory Kratos public port to the public internet (`ngrok http 4433`). 1. Install this project's dependencies with `npm i`. 1. Use the resulting URL and start the environment using `KRATOS_URL=https://.ngrok.io npm start`. Please note that the Web Interface is not working currently due to security features implemented - in ORY Kratos. + in Ory Kratos. diff --git a/app.config.js b/app.config.js index a67711c..e930cde 100644 --- a/app.config.js +++ b/app.config.js @@ -4,7 +4,7 @@ export default (parent = {}) => { const { env = {} } = process || {} const { - // This is the URL of your deployment. In our case we use the ORY Demo + // This is the URL of your deployment. In our case we use the Ory Demo // environment KRATOS_URL = "https://playground.projects.oryapis.com", diff --git a/app.json b/app.json index 861bd58..8866604 100644 --- a/app.json +++ b/app.json @@ -1,6 +1,6 @@ { "expo": { - "name": "ORY Profile App", + "name": "Ory Profile App", "slug": "kratos-selfservice-ui-react-native", "scheme": "kratos-selfservice-ui-react-native", "version": "0.5.14", @@ -30,7 +30,7 @@ "favicon": "./assets/favicon.png" }, "platforms": ["ios", "android", "web"], - "description": "An example app demonstrating login, registration, profile settings, 2fa, account recovery, and more using the ORY Kratos open source project.", + "description": "An example app demonstrating login, registration, profile settings, 2fa, account recovery, and more using the Ory Kratos open source project.", "plugins": ["sentry-expo"], "hooks": { "postPublish": [ diff --git a/src/components/Routes/Registration.tsx b/src/components/Routes/Registration.tsx index bcfc54f..53d3993 100644 --- a/src/components/Routes/Registration.tsx +++ b/src/components/Routes/Registration.tsx @@ -21,10 +21,6 @@ import { logSDKError } from "../../helpers/axios" type Props = StackScreenProps -const redirectUri = AuthSession.makeRedirectUri({ - preferLocalhost: true, - path: "/Callback", -}) const Registration = ({ navigation }: Props) => { const [flow, setFlow] = useState(undefined) const { project } = useContext(ProjectContext) @@ -33,7 +29,15 @@ const Registration = ({ navigation }: Props) => { const initializeFlow = () => newOrySdk(project) .createNativeRegistrationFlow({ - returnTo: redirectUri, + // If you do use social sign in, please add the following URLs to your allowed return to URLs. + // If you the app is running on an emulator or physical device: exp://localhost:8081 + // If you are using the web version: http://localhost:19006 (or whatever port you are using) + // If that does not work, please see the documentation of makeRedirectURI for more information: https://docs.expo.dev/versions/latest/sdk/auth-session/#authsessionmakeredirecturioptions + // If you don't use Social sign in, you can comment out the following line. + returnTo: AuthSession.makeRedirectUri({ + preferLocalhost: true, + path: "/Callback", + }), returnSessionTokenExchangeCode: true, }) // The flow was initialized successfully, let's set the form data: diff --git a/src/helpers/sdk.tsx b/src/helpers/sdk.tsx index ff62d58..283bb60 100644 --- a/src/helpers/sdk.tsx +++ b/src/helpers/sdk.tsx @@ -27,7 +27,7 @@ export const newOrySdk = (project: string) => basePath: kratosUrl(project), baseOptions: { // Setting this is very important as axios will send the CSRF cookie otherwise - // which causes problems with ORY Kratos' security detection. + // which causes problems with Ory Kratos' security detection. withCredentials: false, // Timeout after 5 seconds. From 1614e01fda36c6f2182c9e8d943eac94294a1be1 Mon Sep 17 00:00:00 2001 From: Jonas Hungershausen Date: Thu, 7 Sep 2023 15:12:36 +0200 Subject: [PATCH 3/6] chore: cleanup --- package-lock.json | 962 +++++++++++++++++++++++++++++++----------- package.json | 9 +- src/helpers/axios.tsx | 34 +- src/helpers/form.tsx | 5 +- 4 files changed, 761 insertions(+), 249 deletions(-) diff --git a/package-lock.json b/package-lock.json index 0db5431..aed02bd 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,13 +11,14 @@ "@expo-google-fonts/roboto": "0.2.3", "@expo-google-fonts/rubik": "0.2.3", "@expo/cli": "^0.10.11", - "@ory/client": "1.1.46", + "@ory/client": "1.2.0", "@ory/themes": "0.0.21", "@react-native-async-storage/async-storage": "1.18.2", "@react-native-community/async-storage": "^1.12.1", "@react-native-community/masked-view": "^0.1.11", "@react-navigation/native": "~6.1.7", "@react-navigation/stack": "~6.3.17", + "@redtea/format-axios-error": "2.1.1", "@sentry/integrations": "7.64.0", "@sentry/react-native": "5.5.0", "@types/node": "~18.17.5", @@ -25,19 +26,19 @@ "expo": "^49.0.0", "expo-application": "~5.3.0", "expo-auth-session": "~5.0.2", - "expo-cli": "~6.0.6", + "expo-cli": "6.0.8", "expo-constants": "~14.4.2", "expo-device": "~5.4.0", "expo-linking": "~5.0.2", "expo-random": "~13.2.0", "expo-secure-store": "~12.3.1", "expo-status-bar": "~1.6.0", - "expo-updates": "~0.18.11", + "expo-updates": "~0.18.12", "expo-web-browser": "~12.3.2", "react": "18.2.0", "react-dom": "18.2.0", "react-is": "~17.0.1", - "react-native": "0.72.3", + "react-native": "0.72.4", "react-native-flash-message": "~0.1.17", "react-native-gesture-handler": "~2.12.0", "react-native-reanimated": "~3.3.0", @@ -3860,9 +3861,9 @@ } }, "node_modules/@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dependencies": { "@sinclair/typebox": "^0.27.8" }, @@ -4269,9 +4270,9 @@ } }, "node_modules/@ory/client": { - "version": "1.1.46", - "resolved": "https://registry.npmjs.org/@ory/client/-/client-1.1.46.tgz", - "integrity": "sha512-+GK2Jo3g4gK/JY8XiZNp3blOQlGWlqCFVP8bYNrJ52erGvmYZQYabTXle/fFnwAuKhEn1ADH3kqi9nISye4rcg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ory/client/-/client-1.2.0.tgz", + "integrity": "sha512-d592WJBIyIK4H7c2RZZwptuHpeuZJC3WfXGEzLUF7CnSzXyuLBZI4H7A7KXZDXxhhDBAKA4Tiyht+9QDcDIOrA==", "dependencies": { "axios": "^0.21.4" } @@ -4321,19 +4322,19 @@ } }, "node_modules/@react-native-community/cli": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.3.5.tgz", - "integrity": "sha512-wMXgKEWe6uesw7vyXKKjx5EDRog0QdXHxdgRguG14AjQRao1+4gXEWq2yyExOTi/GDY6dfJBUGTCwGQxhnk/Lg==", - "dependencies": { - "@react-native-community/cli-clean": "11.3.5", - "@react-native-community/cli-config": "11.3.5", - "@react-native-community/cli-debugger-ui": "11.3.5", - "@react-native-community/cli-doctor": "11.3.5", - "@react-native-community/cli-hermes": "11.3.5", - "@react-native-community/cli-plugin-metro": "11.3.5", - "@react-native-community/cli-server-api": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", - "@react-native-community/cli-types": "11.3.5", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.3.6.tgz", + "integrity": "sha512-bdwOIYTBVQ9VK34dsf6t3u6vOUU5lfdhKaAxiAVArjsr7Je88Bgs4sAbsOYsNK3tkE8G77U6wLpekknXcanlww==", + "dependencies": { + "@react-native-community/cli-clean": "11.3.6", + "@react-native-community/cli-config": "11.3.6", + "@react-native-community/cli-debugger-ui": "11.3.6", + "@react-native-community/cli-doctor": "11.3.6", + "@react-native-community/cli-hermes": "11.3.6", + "@react-native-community/cli-plugin-metro": "11.3.6", + "@react-native-community/cli-server-api": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", + "@react-native-community/cli-types": "11.3.6", "chalk": "^4.1.2", "commander": "^9.4.1", "execa": "^5.0.0", @@ -4341,7 +4342,7 @@ "fs-extra": "^8.1.0", "graceful-fs": "^4.1.3", "prompts": "^2.4.0", - "semver": "^6.3.0" + "semver": "^7.5.2" }, "bin": { "react-native": "build/bin.js" @@ -4351,11 +4352,11 @@ } }, "node_modules/@react-native-community/cli-clean": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.3.5.tgz", - "integrity": "sha512-1+7BU962wKkIkHRp/uW3jYbQKKGtU7L+R3g59D8K6uLccuxJYUBJv18753ojMa6SD3SAq5Xh31bAre+YwVcOTA==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.3.6.tgz", + "integrity": "sha512-jOOaeG5ebSXTHweq1NznVJVAFKtTFWL4lWgUXl845bCGX7t1lL8xQNWHKwT8Oh1pGR2CI3cKmRjY4hBg+pEI9g==", "dependencies": { - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "execa": "^5.0.0", "prompts": "^2.4.0" @@ -4557,11 +4558,11 @@ } }, "node_modules/@react-native-community/cli-config": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.3.5.tgz", - "integrity": "sha512-fMblIsHlUleKfGsgWyjFJYfx1SqrsnhS/QXfA8w7iT6GrNOOjBp5UWx8+xlMDFcmOb9e42g1ExFDKl3n8FWkxQ==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.3.6.tgz", + "integrity": "sha512-edy7fwllSFLan/6BG6/rznOBCLPrjmJAE10FzkEqNLHowi0bckiAPg1+1jlgQ2qqAxV5kuk+c9eajVfQvPLYDA==", "dependencies": { - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "cosmiconfig": "^5.1.0", "deepmerge": "^4.3.0", @@ -4634,22 +4635,22 @@ } }, "node_modules/@react-native-community/cli-debugger-ui": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.5.tgz", - "integrity": "sha512-o5JVCKEpPUXMX4r3p1cYjiy3FgdOEkezZcQ6owWEae2dYvV19lLYyJwnocm9Y7aG9PvpgI3PIMVh3KZbhS21eA==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.6.tgz", + "integrity": "sha512-jhMOSN/iOlid9jn/A2/uf7HbC3u7+lGktpeGSLnHNw21iahFBzcpuO71ekEdlmTZ4zC/WyxBXw9j2ka33T358w==", "dependencies": { "serve-static": "^1.13.1" } }, "node_modules/@react-native-community/cli-doctor": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.3.5.tgz", - "integrity": "sha512-+4BuFHjoV4FFjX5y60l0s6nS0agidb1izTVwsFixeFKW73LUkOLu+Ae5HI94RAFEPE4ePEVNgYX3FynIau6K0g==", - "dependencies": { - "@react-native-community/cli-config": "11.3.5", - "@react-native-community/cli-platform-android": "11.3.5", - "@react-native-community/cli-platform-ios": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.3.6.tgz", + "integrity": "sha512-UT/Tt6omVPi1j6JEX+CObc85eVFghSZwy4GR9JFMsO7gNg2Tvcu1RGWlUkrbmWMAMHw127LUu6TGK66Ugu1NLA==", + "dependencies": { + "@react-native-community/cli-config": "11.3.6", + "@react-native-community/cli-platform-android": "11.3.6", + "@react-native-community/cli-platform-ios": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "command-exists": "^1.2.8", "envinfo": "^7.7.2", @@ -4659,7 +4660,7 @@ "node-stream-zip": "^1.9.1", "ora": "^5.4.1", "prompts": "^2.4.0", - "semver": "^6.3.0", + "semver": "^7.5.2", "strip-ansi": "^5.2.0", "sudo-prompt": "^9.0.0", "wcwidth": "^1.0.1", @@ -4802,6 +4803,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@react-native-community/cli-doctor/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@react-native-community/cli-doctor/node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -4888,6 +4900,20 @@ "node": ">=8" } }, + "node_modules/@react-native-community/cli-doctor/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@react-native-community/cli-doctor/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -4956,13 +4982,18 @@ "node": ">= 8" } }, + "node_modules/@react-native-community/cli-doctor/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/@react-native-community/cli-hermes": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.3.5.tgz", - "integrity": "sha512-+3m34hiaJpFel8BlJE7kJOaPzWR/8U8APZG2LXojbAdBAg99EGmQcwXIgsSVJFvH8h/nezf4DHbsPKigIe33zA==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.3.6.tgz", + "integrity": "sha512-O55YAYGZ3XynpUdePPVvNuUPGPY0IJdctLAOHme73OvS80gNwfntHDXfmY70TGHWIfkK2zBhA0B+2v8s5aTyTA==", "dependencies": { - "@react-native-community/cli-platform-android": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-platform-android": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "hermes-profile-transformer": "^0.0.6", "ip": "^1.1.5" @@ -5033,11 +5064,11 @@ } }, "node_modules/@react-native-community/cli-platform-android": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.5.tgz", - "integrity": "sha512-s4Lj7FKxJ/BofGi/ifjPfrA9MjFwIgYpHnHBSlqtbsvPoSYzmVCU2qlWM8fb3AmkXIwyYt4A6MEr3MmNT2UoBg==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.6.tgz", + "integrity": "sha512-ZARrpLv5tn3rmhZc//IuDM1LSAdYnjUmjrp58RynlvjLDI4ZEjBAGCQmgysRgXAsK7ekMrfkZgemUczfn9td2A==", "dependencies": { - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "execa": "^5.0.0", "glob": "^7.1.3", @@ -5240,11 +5271,11 @@ } }, "node_modules/@react-native-community/cli-platform-ios": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.5.tgz", - "integrity": "sha512-ytJC/YCFD7P+KuQHOT5Jzh1ho2XbJEjq71yHa1gJP2PG/Q/uB4h1x2XpxDqv5iXU6E250yjvKMmkReKTW4CTig==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.6.tgz", + "integrity": "sha512-tZ9VbXWiRW+F+fbZzpLMZlj93g3Q96HpuMsS6DRhrTiG+vMQ3o6oPWSEEmMGOvJSYU7+y68Dc9ms2liC7VD6cw==", "dependencies": { - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-xml-parser": "^4.0.12", @@ -5508,12 +5539,12 @@ } }, "node_modules/@react-native-community/cli-plugin-metro": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.5.tgz", - "integrity": "sha512-r9AekfeLKdblB7LfWB71IrNy1XM03WrByQlUQajUOZAP2NmUUBLl9pMZscPjJeOSgLpHB9ixEFTIOhTabri/qg==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.6.tgz", + "integrity": "sha512-D97racrPX3069ibyabJNKw9aJpVcaZrkYiEzsEnx50uauQtPDoQ1ELb/5c6CtMhAEGKoZ0B5MS23BbsSZcLs2g==", "dependencies": { - "@react-native-community/cli-server-api": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-server-api": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "execa": "^5.0.0", "metro": "0.76.7", @@ -5635,6 +5666,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@react-native-community/cli-plugin-metro/node_modules/metro-runtime": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz", + "integrity": "sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/@react-native-community/cli-plugin-metro/node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -5721,12 +5764,12 @@ } }, "node_modules/@react-native-community/cli-server-api": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.3.5.tgz", - "integrity": "sha512-PM/jF13uD1eAKuC84lntNuM5ZvJAtyb+H896P1dBIXa9boPLa3KejfUvNVoyOUJ5s8Ht25JKbc3yieV2+GMBDA==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.3.6.tgz", + "integrity": "sha512-8GUKodPnURGtJ9JKg8yOHIRtWepPciI3ssXVw5jik7+dZ43yN8P5BqCoDaq8e1H1yRer27iiOfT7XVnwk8Dueg==", "dependencies": { - "@react-native-community/cli-debugger-ui": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-debugger-ui": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", @@ -5757,9 +5800,9 @@ } }, "node_modules/@react-native-community/cli-tools": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.3.5.tgz", - "integrity": "sha512-zDklE1+ah/zL4BLxut5XbzqCj9KTHzbYBKX7//cXw2/0TpkNCaY9c+iKx//gZ5m7U1OKbb86Fm2b0AKtKVRf6Q==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.3.6.tgz", + "integrity": "sha512-JpmUTcDwAGiTzLsfMlIAYpCMSJ9w2Qlf7PU7mZIRyEu61UzEawyw83DkqfbzDPBuRwRnaeN44JX2CP/yTO3ThQ==", "dependencies": { "appdirsjs": "^1.2.4", "chalk": "^4.1.2", @@ -5768,7 +5811,7 @@ "node-fetch": "^2.6.0", "open": "^6.2.0", "ora": "^5.4.1", - "semver": "^6.3.0", + "semver": "^7.5.2", "shell-quote": "^1.7.3" } }, @@ -5859,6 +5902,17 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/@react-native-community/cli-tools/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@react-native-community/cli-tools/node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -5926,6 +5980,20 @@ "node": ">=8" } }, + "node_modules/@react-native-community/cli-tools/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@react-native-community/cli-tools/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -5937,10 +6005,15 @@ "node": ">=8" } }, + "node_modules/@react-native-community/cli-tools/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/@react-native-community/cli-types": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.3.5.tgz", - "integrity": "sha512-pf0kdWMEfPSV/+8rcViDCFzbLMtWIHMZ8ay7hKwqaoWegsJ0oprSF2tSTH+LSC/7X1Beb9ssIvHj1m5C4es5Xg==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.3.6.tgz", + "integrity": "sha512-6DxjrMKx5x68N/tCJYVYRKAtlRHbtUVBZrnAvkxbRWFD9v4vhNgsPM0RQm8i2vRugeksnao5mbnRGpS6c0awCw==", "dependencies": { "joi": "^17.2.1" } @@ -6086,6 +6159,17 @@ "node": ">=8" } }, + "node_modules/@react-native-community/cli/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@react-native-community/cli/node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -6152,6 +6236,20 @@ "node": ">=8" } }, + "node_modules/@react-native-community/cli/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@react-native-community/cli/node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -6196,6 +6294,11 @@ "node": ">= 8" } }, + "node_modules/@react-native-community/cli/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/@react-native-community/masked-view": { "version": "0.1.11", "resolved": "https://registry.npmjs.org/@react-native-community/masked-view/-/masked-view-0.1.11.tgz", @@ -6358,6 +6461,14 @@ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, + "node_modules/@redtea/format-axios-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@redtea/format-axios-error/-/format-axios-error-2.1.1.tgz", + "integrity": "sha512-bGfqYctnX/+nBuHsOo6RDP8JrHoetnf6BEK5+v1lmbVg5w9kvt/UmKg+5YlT3YCj4UQZX86LdN6cZF083A9fyA==", + "dependencies": { + "logform": "2.2.0" + } + }, "node_modules/@segment/loosely-validate-event": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", @@ -9371,6 +9482,14 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" }, + "node_modules/colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "engines": { + "node": ">=0.1.90" + } + }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -12803,9 +12922,9 @@ "integrity": "sha512-t+h5Zqaukd3Tn97LaWPpibVsmiC/TFP8F+8sAUliwCSMzgcb5TATRs2NcAB+JcIr8EP3JJDyYXJrZle1cjs4mQ==" }, "node_modules/expo-updates": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.18.11.tgz", - "integrity": "sha512-X7huYVAq7RhBUcoGQKk2P9K0LJdDr5EDBPQbHRM/zrQNXuW7DhCkQBVbhT6/L7pIqdVAsAxx0FqxcZcx44pDWA==", + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.18.12.tgz", + "integrity": "sha512-oJlAVJd/SiQNnNGha+OILc/QA5z6qfrrT2W/eGWWI9POxTka0Z0Obyi/jTkruh72J6wtWbtto65DLJKS93RzdA==", "dependencies": { "@expo/code-signing-certificates": "0.0.5", "@expo/config": "~8.1.0", @@ -13232,6 +13351,11 @@ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz", "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==" }, + "node_modules/fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "node_modules/fast-xml-parser": { "version": "4.2.7", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz", @@ -13325,6 +13449,11 @@ "node": "*" } }, + "node_modules/fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "node_modules/fetch-retry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", @@ -15905,9 +16034,9 @@ } }, "node_modules/jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } @@ -16262,27 +16391,27 @@ } }, "node_modules/jest-validate": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", - "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "dependencies": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.2" + "pretty-format": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -16355,11 +16484,11 @@ } }, "node_modules/jest-validate/node_modules/pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "dependencies": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -17120,6 +17249,18 @@ "node": ">=4" } }, + "node_modules/logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "dependencies": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, "node_modules/logkitty": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", @@ -17612,6 +17753,18 @@ "node": ">=16" } }, + "node_modules/metro-config/node_modules/metro-runtime": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz", + "integrity": "sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/metro-core": { "version": "0.76.7", "resolved": "https://registry.npmjs.org/metro-core/-/metro-core-0.76.7.tgz", @@ -17917,9 +18070,9 @@ } }, "node_modules/metro-runtime": { - "version": "0.76.7", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz", - "integrity": "sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==", + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.8.tgz", + "integrity": "sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==", "dependencies": { "@babel/runtime": "^7.0.0", "react-refresh": "^0.4.0" @@ -17929,19 +18082,38 @@ } }, "node_modules/metro-source-map": { - "version": "0.76.7", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz", - "integrity": "sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==", + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.8.tgz", + "integrity": "sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==", "dependencies": { "@babel/traverse": "^7.20.0", "@babel/types": "^7.20.0", "invariant": "^2.2.4", - "metro-symbolicate": "0.76.7", + "metro-symbolicate": "0.76.8", + "nullthrows": "^1.1.1", + "ob1": "0.76.8", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-source-map/node_modules/metro-symbolicate": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz", + "integrity": "sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==", + "dependencies": { + "invariant": "^2.2.4", + "metro-source-map": "0.76.8", "nullthrows": "^1.1.1", - "ob1": "0.76.7", "source-map": "^0.5.6", + "through2": "^2.0.1", "vlq": "^1.0.0" }, + "bin": { + "metro-symbolicate": "src/index.js" + }, "engines": { "node": ">=16" } @@ -17973,6 +18145,32 @@ "node": ">=16" } }, + "node_modules/metro-symbolicate/node_modules/metro-source-map": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz", + "integrity": "sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.76.7", + "nullthrows": "^1.1.1", + "ob1": "0.76.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-symbolicate/node_modules/ob1": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz", + "integrity": "sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==", + "engines": { + "node": ">=16" + } + }, "node_modules/metro-symbolicate/node_modules/source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -18018,6 +18216,40 @@ "node": ">=16" } }, + "node_modules/metro-transform-worker/node_modules/metro-source-map": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz", + "integrity": "sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.76.7", + "nullthrows": "^1.1.1", + "ob1": "0.76.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-transform-worker/node_modules/ob1": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz", + "integrity": "sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==", + "engines": { + "node": ">=16" + } + }, + "node_modules/metro-transform-worker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/metro/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -18084,11 +18316,49 @@ "node": ">=8" } }, + "node_modules/metro/node_modules/metro-runtime": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz", + "integrity": "sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/metro/node_modules/metro-source-map": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz", + "integrity": "sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==", + "dependencies": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.76.7", + "nullthrows": "^1.1.1", + "ob1": "0.76.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/metro/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/metro/node_modules/ob1": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz", + "integrity": "sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==", + "engines": { + "node": ">=16" + } + }, "node_modules/metro/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -18904,9 +19174,9 @@ "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "node_modules/ob1": { - "version": "0.76.7", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz", - "integrity": "sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==", + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.8.tgz", + "integrity": "sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==", "engines": { "node": ">=16" } @@ -22278,20 +22548,20 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "node_modules/react-native": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.72.3.tgz", - "integrity": "sha512-QqISi+JVmCssNP2FlQ4MWhlc4O/I00MRE1/GClvyZ8h/6kdsyk/sOirkYdZqX3+DrJfI3q+OnyMnsyaXIQ/5tQ==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.72.4.tgz", + "integrity": "sha512-+vrObi0wZR+NeqL09KihAAdVlQ9IdplwznJWtYrjnQ4UbCW6rkzZJebRsugwUneSOKNFaHFEo1uKU89HsgtYBg==", "dependencies": { "@jest/create-cache-key-function": "^29.2.1", - "@react-native-community/cli": "11.3.5", - "@react-native-community/cli-platform-android": "11.3.5", - "@react-native-community/cli-platform-ios": "11.3.5", + "@react-native-community/cli": "11.3.6", + "@react-native-community/cli-platform-android": "11.3.6", + "@react-native-community/cli-platform-ios": "11.3.6", "@react-native/assets-registry": "^0.72.0", "@react-native/codegen": "^0.72.6", "@react-native/gradle-plugin": "^0.72.11", "@react-native/js-polyfills": "^0.72.1", "@react-native/normalize-colors": "^0.72.0", - "@react-native/virtualized-lists": "^0.72.6", + "@react-native/virtualized-lists": "^0.72.8", "abort-controller": "^3.0.0", "anser": "^1.4.9", "base64-js": "^1.1.2", @@ -22302,8 +22572,8 @@ "jest-environment-node": "^29.2.1", "jsc-android": "^250231.0.0", "memoize-one": "^5.0.0", - "metro-runtime": "0.76.7", - "metro-source-map": "0.76.7", + "metro-runtime": "0.76.8", + "metro-source-map": "0.76.8", "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", "pretty-format": "^26.5.2", @@ -24992,9 +25262,9 @@ } }, "node_modules/terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -25417,6 +25687,14 @@ "node": ">=0.6" } }, + "node_modules/triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", + "engines": { + "node": ">= 14.0.0" + } + }, "node_modules/ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -28479,9 +28757,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", "engines": { "node": ">= 14" } @@ -31267,9 +31545,9 @@ } }, "@jest/schemas": { - "version": "29.6.0", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", - "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "requires": { "@sinclair/typebox": "^0.27.8" } @@ -31530,9 +31808,9 @@ } }, "@ory/client": { - "version": "1.1.46", - "resolved": "https://registry.npmjs.org/@ory/client/-/client-1.1.46.tgz", - "integrity": "sha512-+GK2Jo3g4gK/JY8XiZNp3blOQlGWlqCFVP8bYNrJ52erGvmYZQYabTXle/fFnwAuKhEn1ADH3kqi9nISye4rcg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ory/client/-/client-1.2.0.tgz", + "integrity": "sha512-d592WJBIyIK4H7c2RZZwptuHpeuZJC3WfXGEzLUF7CnSzXyuLBZI4H7A7KXZDXxhhDBAKA4Tiyht+9QDcDIOrA==", "requires": { "axios": "^0.21.4" }, @@ -31576,19 +31854,19 @@ } }, "@react-native-community/cli": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.3.5.tgz", - "integrity": "sha512-wMXgKEWe6uesw7vyXKKjx5EDRog0QdXHxdgRguG14AjQRao1+4gXEWq2yyExOTi/GDY6dfJBUGTCwGQxhnk/Lg==", - "requires": { - "@react-native-community/cli-clean": "11.3.5", - "@react-native-community/cli-config": "11.3.5", - "@react-native-community/cli-debugger-ui": "11.3.5", - "@react-native-community/cli-doctor": "11.3.5", - "@react-native-community/cli-hermes": "11.3.5", - "@react-native-community/cli-plugin-metro": "11.3.5", - "@react-native-community/cli-server-api": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", - "@react-native-community/cli-types": "11.3.5", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli/-/cli-11.3.6.tgz", + "integrity": "sha512-bdwOIYTBVQ9VK34dsf6t3u6vOUU5lfdhKaAxiAVArjsr7Je88Bgs4sAbsOYsNK3tkE8G77U6wLpekknXcanlww==", + "requires": { + "@react-native-community/cli-clean": "11.3.6", + "@react-native-community/cli-config": "11.3.6", + "@react-native-community/cli-debugger-ui": "11.3.6", + "@react-native-community/cli-doctor": "11.3.6", + "@react-native-community/cli-hermes": "11.3.6", + "@react-native-community/cli-plugin-metro": "11.3.6", + "@react-native-community/cli-server-api": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", + "@react-native-community/cli-types": "11.3.6", "chalk": "^4.1.2", "commander": "^9.4.1", "execa": "^5.0.0", @@ -31596,7 +31874,7 @@ "fs-extra": "^8.1.0", "graceful-fs": "^4.1.3", "prompts": "^2.4.0", - "semver": "^6.3.0" + "semver": "^7.5.2" }, "dependencies": { "ansi-styles": { @@ -31692,6 +31970,14 @@ "p-locate": "^4.1.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -31734,6 +32020,14 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -31762,15 +32056,20 @@ "requires": { "isexe": "^2.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@react-native-community/cli-clean": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.3.5.tgz", - "integrity": "sha512-1+7BU962wKkIkHRp/uW3jYbQKKGtU7L+R3g59D8K6uLccuxJYUBJv18753ojMa6SD3SAq5Xh31bAre+YwVcOTA==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-clean/-/cli-clean-11.3.6.tgz", + "integrity": "sha512-jOOaeG5ebSXTHweq1NznVJVAFKtTFWL4lWgUXl845bCGX7t1lL8xQNWHKwT8Oh1pGR2CI3cKmRjY4hBg+pEI9g==", "requires": { - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "execa": "^5.0.0", "prompts": "^2.4.0" @@ -31905,11 +32204,11 @@ } }, "@react-native-community/cli-config": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.3.5.tgz", - "integrity": "sha512-fMblIsHlUleKfGsgWyjFJYfx1SqrsnhS/QXfA8w7iT6GrNOOjBp5UWx8+xlMDFcmOb9e42g1ExFDKl3n8FWkxQ==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-config/-/cli-config-11.3.6.tgz", + "integrity": "sha512-edy7fwllSFLan/6BG6/rznOBCLPrjmJAE10FzkEqNLHowi0bckiAPg1+1jlgQ2qqAxV5kuk+c9eajVfQvPLYDA==", "requires": { - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "cosmiconfig": "^5.1.0", "deepmerge": "^4.3.0", @@ -31963,22 +32262,22 @@ } }, "@react-native-community/cli-debugger-ui": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.5.tgz", - "integrity": "sha512-o5JVCKEpPUXMX4r3p1cYjiy3FgdOEkezZcQ6owWEae2dYvV19lLYyJwnocm9Y7aG9PvpgI3PIMVh3KZbhS21eA==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-11.3.6.tgz", + "integrity": "sha512-jhMOSN/iOlid9jn/A2/uf7HbC3u7+lGktpeGSLnHNw21iahFBzcpuO71ekEdlmTZ4zC/WyxBXw9j2ka33T358w==", "requires": { "serve-static": "^1.13.1" } }, "@react-native-community/cli-doctor": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.3.5.tgz", - "integrity": "sha512-+4BuFHjoV4FFjX5y60l0s6nS0agidb1izTVwsFixeFKW73LUkOLu+Ae5HI94RAFEPE4ePEVNgYX3FynIau6K0g==", - "requires": { - "@react-native-community/cli-config": "11.3.5", - "@react-native-community/cli-platform-android": "11.3.5", - "@react-native-community/cli-platform-ios": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-doctor/-/cli-doctor-11.3.6.tgz", + "integrity": "sha512-UT/Tt6omVPi1j6JEX+CObc85eVFghSZwy4GR9JFMsO7gNg2Tvcu1RGWlUkrbmWMAMHw127LUu6TGK66Ugu1NLA==", + "requires": { + "@react-native-community/cli-config": "11.3.6", + "@react-native-community/cli-platform-android": "11.3.6", + "@react-native-community/cli-platform-ios": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "command-exists": "^1.2.8", "envinfo": "^7.7.2", @@ -31988,7 +32287,7 @@ "node-stream-zip": "^1.9.1", "ora": "^5.4.1", "prompts": "^2.4.0", - "semver": "^6.3.0", + "semver": "^7.5.2", "strip-ansi": "^5.2.0", "sudo-prompt": "^9.0.0", "wcwidth": "^1.0.1", @@ -32083,6 +32382,14 @@ "is-unicode-supported": "^0.1.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -32144,6 +32451,14 @@ "signal-exit": "^3.0.2" } }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -32192,16 +32507,21 @@ "requires": { "isexe": "^2.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@react-native-community/cli-hermes": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.3.5.tgz", - "integrity": "sha512-+3m34hiaJpFel8BlJE7kJOaPzWR/8U8APZG2LXojbAdBAg99EGmQcwXIgsSVJFvH8h/nezf4DHbsPKigIe33zA==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-hermes/-/cli-hermes-11.3.6.tgz", + "integrity": "sha512-O55YAYGZ3XynpUdePPVvNuUPGPY0IJdctLAOHme73OvS80gNwfntHDXfmY70TGHWIfkK2zBhA0B+2v8s5aTyTA==", "requires": { - "@react-native-community/cli-platform-android": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-platform-android": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "hermes-profile-transformer": "^0.0.6", "ip": "^1.1.5" @@ -32253,11 +32573,11 @@ } }, "@react-native-community/cli-platform-android": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.5.tgz", - "integrity": "sha512-s4Lj7FKxJ/BofGi/ifjPfrA9MjFwIgYpHnHBSlqtbsvPoSYzmVCU2qlWM8fb3AmkXIwyYt4A6MEr3MmNT2UoBg==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-android/-/cli-platform-android-11.3.6.tgz", + "integrity": "sha512-ZARrpLv5tn3rmhZc//IuDM1LSAdYnjUmjrp58RynlvjLDI4ZEjBAGCQmgysRgXAsK7ekMrfkZgemUczfn9td2A==", "requires": { - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "execa": "^5.0.0", "glob": "^7.1.3", @@ -32393,11 +32713,11 @@ } }, "@react-native-community/cli-platform-ios": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.5.tgz", - "integrity": "sha512-ytJC/YCFD7P+KuQHOT5Jzh1ho2XbJEjq71yHa1gJP2PG/Q/uB4h1x2XpxDqv5iXU6E250yjvKMmkReKTW4CTig==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-platform-ios/-/cli-platform-ios-11.3.6.tgz", + "integrity": "sha512-tZ9VbXWiRW+F+fbZzpLMZlj93g3Q96HpuMsS6DRhrTiG+vMQ3o6oPWSEEmMGOvJSYU7+y68Dc9ms2liC7VD6cw==", "requires": { - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "execa": "^5.0.0", "fast-xml-parser": "^4.0.12", @@ -32576,12 +32896,12 @@ } }, "@react-native-community/cli-plugin-metro": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.5.tgz", - "integrity": "sha512-r9AekfeLKdblB7LfWB71IrNy1XM03WrByQlUQajUOZAP2NmUUBLl9pMZscPjJeOSgLpHB9ixEFTIOhTabri/qg==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-plugin-metro/-/cli-plugin-metro-11.3.6.tgz", + "integrity": "sha512-D97racrPX3069ibyabJNKw9aJpVcaZrkYiEzsEnx50uauQtPDoQ1ELb/5c6CtMhAEGKoZ0B5MS23BbsSZcLs2g==", "requires": { - "@react-native-community/cli-server-api": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-server-api": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", "chalk": "^4.1.2", "execa": "^5.0.0", "metro": "0.76.7", @@ -32664,6 +32984,15 @@ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, + "metro-runtime": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz", + "integrity": "sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==", + "requires": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -32722,12 +33051,12 @@ } }, "@react-native-community/cli-server-api": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.3.5.tgz", - "integrity": "sha512-PM/jF13uD1eAKuC84lntNuM5ZvJAtyb+H896P1dBIXa9boPLa3KejfUvNVoyOUJ5s8Ht25JKbc3yieV2+GMBDA==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-server-api/-/cli-server-api-11.3.6.tgz", + "integrity": "sha512-8GUKodPnURGtJ9JKg8yOHIRtWepPciI3ssXVw5jik7+dZ43yN8P5BqCoDaq8e1H1yRer27iiOfT7XVnwk8Dueg==", "requires": { - "@react-native-community/cli-debugger-ui": "11.3.5", - "@react-native-community/cli-tools": "11.3.5", + "@react-native-community/cli-debugger-ui": "11.3.6", + "@react-native-community/cli-tools": "11.3.6", "compression": "^1.7.1", "connect": "^3.6.5", "errorhandler": "^1.5.1", @@ -32745,9 +33074,9 @@ } }, "@react-native-community/cli-tools": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.3.5.tgz", - "integrity": "sha512-zDklE1+ah/zL4BLxut5XbzqCj9KTHzbYBKX7//cXw2/0TpkNCaY9c+iKx//gZ5m7U1OKbb86Fm2b0AKtKVRf6Q==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-tools/-/cli-tools-11.3.6.tgz", + "integrity": "sha512-JpmUTcDwAGiTzLsfMlIAYpCMSJ9w2Qlf7PU7mZIRyEu61UzEawyw83DkqfbzDPBuRwRnaeN44JX2CP/yTO3ThQ==", "requires": { "appdirsjs": "^1.2.4", "chalk": "^4.1.2", @@ -32756,7 +33085,7 @@ "node-fetch": "^2.6.0", "open": "^6.2.0", "ora": "^5.4.1", - "semver": "^6.3.0", + "semver": "^7.5.2", "shell-quote": "^1.7.3" }, "dependencies": { @@ -32817,6 +33146,14 @@ "is-unicode-supported": "^0.1.0" } }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", @@ -32863,6 +33200,14 @@ "signal-exit": "^3.0.2" } }, + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -32870,13 +33215,18 @@ "requires": { "has-flag": "^4.0.0" } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" } } }, "@react-native-community/cli-types": { - "version": "11.3.5", - "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.3.5.tgz", - "integrity": "sha512-pf0kdWMEfPSV/+8rcViDCFzbLMtWIHMZ8ay7hKwqaoWegsJ0oprSF2tSTH+LSC/7X1Beb9ssIvHj1m5C4es5Xg==", + "version": "11.3.6", + "resolved": "https://registry.npmjs.org/@react-native-community/cli-types/-/cli-types-11.3.6.tgz", + "integrity": "sha512-6DxjrMKx5x68N/tCJYVYRKAtlRHbtUVBZrnAvkxbRWFD9v4vhNgsPM0RQm8i2vRugeksnao5mbnRGpS6c0awCw==", "requires": { "joi": "^17.2.1" } @@ -33009,6 +33359,14 @@ } } }, + "@redtea/format-axios-error": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@redtea/format-axios-error/-/format-axios-error-2.1.1.tgz", + "integrity": "sha512-bGfqYctnX/+nBuHsOo6RDP8JrHoetnf6BEK5+v1lmbVg5w9kvt/UmKg+5YlT3YCj4UQZX86LdN6cZF083A9fyA==", + "requires": { + "logform": "2.2.0" + } + }, "@segment/loosely-validate-event": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@segment/loosely-validate-event/-/loosely-validate-event-2.0.0.tgz", @@ -35433,6 +35791,11 @@ "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" + }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", @@ -38146,9 +38509,9 @@ "integrity": "sha512-t+h5Zqaukd3Tn97LaWPpibVsmiC/TFP8F+8sAUliwCSMzgcb5TATRs2NcAB+JcIr8EP3JJDyYXJrZle1cjs4mQ==" }, "expo-updates": { - "version": "0.18.11", - "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.18.11.tgz", - "integrity": "sha512-X7huYVAq7RhBUcoGQKk2P9K0LJdDr5EDBPQbHRM/zrQNXuW7DhCkQBVbhT6/L7pIqdVAsAxx0FqxcZcx44pDWA==", + "version": "0.18.12", + "resolved": "https://registry.npmjs.org/expo-updates/-/expo-updates-0.18.12.tgz", + "integrity": "sha512-oJlAVJd/SiQNnNGha+OILc/QA5z6qfrrT2W/eGWWI9POxTka0Z0Obyi/jTkruh72J6wtWbtto65DLJKS93RzdA==", "requires": { "@expo/code-signing-certificates": "0.0.5", "@expo/config": "~8.1.0", @@ -38488,6 +38851,11 @@ "resolved": "https://registry.npmjs.org/fast-loops/-/fast-loops-1.1.3.tgz", "integrity": "sha512-8EZzEP0eKkEEVX+drtd9mtuQ+/QrlfW/5MlwcwK5Nds6EkZ/tRzEexkzUY2mIssnAyVLT+TKHuRXmFNNXYUd6g==" }, + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, "fast-xml-parser": { "version": "4.2.7", "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.2.7.tgz", @@ -38554,6 +38922,11 @@ "resolved": "https://registry.npmjs.org/fbjs-css-vars/-/fbjs-css-vars-1.0.2.tgz", "integrity": "sha512-b2XGFAFdWZWg0phtAWLHCk836A1Xann+I+Dgd3Gk64MHKZO44FfoD1KxyvbSh0qZsIoXQGGlVztIY+oitJPpRQ==" }, + "fecha": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", + "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" + }, "fetch-retry": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-4.1.1.tgz", @@ -40482,9 +40855,9 @@ } }, "jest-get-type": { - "version": "29.4.3", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", - "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==" + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==" }, "jest-message-util": { "version": "29.6.2", @@ -40751,24 +41124,24 @@ } }, "jest-validate": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.2.tgz", - "integrity": "sha512-vGz0yMN5fUFRRbpJDPwxMpgSXW1LDKROHfBopAvDcmD6s+B/s8WJrwi+4bfH4SdInBA5C3P3BI19dBtKzx1Arg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz", + "integrity": "sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg==", "requires": { - "@jest/types": "^29.6.1", + "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", - "jest-get-type": "^29.4.3", + "jest-get-type": "^29.6.3", "leven": "^3.1.0", - "pretty-format": "^29.6.2" + "pretty-format": "^29.6.3" }, "dependencies": { "@jest/types": { - "version": "29.6.1", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", - "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", + "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "requires": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", @@ -40820,11 +41193,11 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "pretty-format": { - "version": "29.6.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.2.tgz", - "integrity": "sha512-1q0oC8eRveTg5nnBEWMXAU2qpv65Gnuf2eCQzSjxpWFkPaPARwqZZDGuNE0zPAZfTCHzIk3A8dIjwlQKKLphyg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", "requires": { - "@jest/schemas": "^29.6.0", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -41380,6 +41753,18 @@ "chalk": "^2.0.1" } }, + "logform": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", + "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", + "requires": { + "colors": "^1.2.1", + "fast-safe-stringify": "^2.0.4", + "fecha": "^4.2.0", + "ms": "^2.1.1", + "triple-beam": "^1.3.0" + } + }, "logkitty": { "version": "0.7.1", "resolved": "https://registry.npmjs.org/logkitty/-/logkitty-0.7.1.tgz", @@ -41774,11 +42159,40 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, + "metro-runtime": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz", + "integrity": "sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==", + "requires": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + }, + "metro-source-map": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz", + "integrity": "sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==", + "requires": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.76.7", + "nullthrows": "^1.1.1", + "ob1": "0.76.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "ob1": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz", + "integrity": "sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==" + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -41858,6 +42272,17 @@ "metro-cache": "0.76.7", "metro-core": "0.76.7", "metro-runtime": "0.76.7" + }, + "dependencies": { + "metro-runtime": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz", + "integrity": "sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==", + "requires": { + "@babel/runtime": "^7.0.0", + "react-refresh": "^0.4.0" + } + } } }, "metro-core": { @@ -42092,29 +42517,42 @@ "integrity": "sha512-pC0Wgq29HHIHrwz23xxiNgylhI8Rq1V01kQaJ9Kz11zWrIdlrH0ZdnJ7GC6qA0ErROG+cXmJ0rJb8/SW1Zp2IA==" }, "metro-runtime": { - "version": "0.76.7", - "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.7.tgz", - "integrity": "sha512-MuWHubQHymUWBpZLwuKZQgA/qbb35WnDAKPo83rk7JRLIFPvzXSvFaC18voPuzJBt1V98lKQIonh6MiC9gd8Ug==", + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-runtime/-/metro-runtime-0.76.8.tgz", + "integrity": "sha512-XKahvB+iuYJSCr3QqCpROli4B4zASAYpkK+j3a0CJmokxCDNbgyI4Fp88uIL6rNaZfN0Mv35S0b99SdFXIfHjg==", "requires": { "@babel/runtime": "^7.0.0", "react-refresh": "^0.4.0" } }, "metro-source-map": { - "version": "0.76.7", - "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz", - "integrity": "sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==", + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.8.tgz", + "integrity": "sha512-Hh0ncPsHPVf6wXQSqJqB3K9Zbudht4aUtNpNXYXSxH+pteWqGAXnjtPsRAnCsCWl38wL0jYF0rJDdMajUI3BDw==", "requires": { "@babel/traverse": "^7.20.0", "@babel/types": "^7.20.0", "invariant": "^2.2.4", - "metro-symbolicate": "0.76.7", + "metro-symbolicate": "0.76.8", "nullthrows": "^1.1.1", - "ob1": "0.76.7", + "ob1": "0.76.8", "source-map": "^0.5.6", "vlq": "^1.0.0" }, "dependencies": { + "metro-symbolicate": { + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/metro-symbolicate/-/metro-symbolicate-0.76.8.tgz", + "integrity": "sha512-LrRL3uy2VkzrIXVlxoPtqb40J6Bf1mlPNmUQewipc3qfKKFgtPHBackqDy1YL0njDsWopCKcfGtFYLn0PTUn3w==", + "requires": { + "invariant": "^2.2.4", + "metro-source-map": "0.76.8", + "nullthrows": "^1.1.1", + "source-map": "^0.5.6", + "through2": "^2.0.1", + "vlq": "^1.0.0" + } + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -42135,6 +42573,26 @@ "vlq": "^1.0.0" }, "dependencies": { + "metro-source-map": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz", + "integrity": "sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==", + "requires": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.76.7", + "nullthrows": "^1.1.1", + "ob1": "0.76.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "ob1": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz", + "integrity": "sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==" + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -42171,6 +42629,33 @@ "metro-source-map": "0.76.7", "metro-transform-plugins": "0.76.7", "nullthrows": "^1.1.1" + }, + "dependencies": { + "metro-source-map": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/metro-source-map/-/metro-source-map-0.76.7.tgz", + "integrity": "sha512-Prhx7PeRV1LuogT0Kn5VjCuFu9fVD68eefntdWabrksmNY6mXK8pRqzvNJOhTojh6nek+RxBzZeD6MIOOyXS6w==", + "requires": { + "@babel/traverse": "^7.20.0", + "@babel/types": "^7.20.0", + "invariant": "^2.2.4", + "metro-symbolicate": "0.76.7", + "nullthrows": "^1.1.1", + "ob1": "0.76.7", + "source-map": "^0.5.6", + "vlq": "^1.0.0" + } + }, + "ob1": { + "version": "0.76.7", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz", + "integrity": "sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } } }, "microevent.ts": { @@ -42783,9 +43268,9 @@ "integrity": "sha512-2vPPEi+Z7WqML2jZYddDIfy5Dqb0r2fze2zTxNNknZaFpVHU3mFB3R+DWeJWGVx0ecvttSGlJTI+WG+8Z4cDWw==" }, "ob1": { - "version": "0.76.7", - "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.7.tgz", - "integrity": "sha512-BQdRtxxoUNfSoZxqeBGOyuT9nEYSn18xZHwGMb0mMVpn2NBcYbnyKY4BK2LIHRgw33CBGlUmE+KMaNvyTpLLtQ==" + "version": "0.76.8", + "resolved": "https://registry.npmjs.org/ob1/-/ob1-0.76.8.tgz", + "integrity": "sha512-dlBkJJV5M/msj9KYA9upc+nUWVwuOFFTbu28X6kZeGwcuW+JxaHSBZ70SYQnk5M+j5JbNLR6yKHmgW4M5E7X5g==" }, "object-assign": { "version": "4.1.1", @@ -45325,20 +45810,20 @@ "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" }, "react-native": { - "version": "0.72.3", - "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.72.3.tgz", - "integrity": "sha512-QqISi+JVmCssNP2FlQ4MWhlc4O/I00MRE1/GClvyZ8h/6kdsyk/sOirkYdZqX3+DrJfI3q+OnyMnsyaXIQ/5tQ==", + "version": "0.72.4", + "resolved": "https://registry.npmjs.org/react-native/-/react-native-0.72.4.tgz", + "integrity": "sha512-+vrObi0wZR+NeqL09KihAAdVlQ9IdplwznJWtYrjnQ4UbCW6rkzZJebRsugwUneSOKNFaHFEo1uKU89HsgtYBg==", "requires": { "@jest/create-cache-key-function": "^29.2.1", - "@react-native-community/cli": "11.3.5", - "@react-native-community/cli-platform-android": "11.3.5", - "@react-native-community/cli-platform-ios": "11.3.5", + "@react-native-community/cli": "11.3.6", + "@react-native-community/cli-platform-android": "11.3.6", + "@react-native-community/cli-platform-ios": "11.3.6", "@react-native/assets-registry": "^0.72.0", "@react-native/codegen": "^0.72.6", "@react-native/gradle-plugin": "^0.72.11", "@react-native/js-polyfills": "^0.72.1", "@react-native/normalize-colors": "^0.72.0", - "@react-native/virtualized-lists": "^0.72.6", + "@react-native/virtualized-lists": "^0.72.8", "abort-controller": "^3.0.0", "anser": "^1.4.9", "base64-js": "^1.1.2", @@ -45349,8 +45834,8 @@ "jest-environment-node": "^29.2.1", "jsc-android": "^250231.0.0", "memoize-one": "^5.0.0", - "metro-runtime": "0.76.7", - "metro-source-map": "0.76.7", + "metro-runtime": "0.76.8", + "metro-source-map": "0.76.8", "mkdirp": "^0.5.1", "nullthrows": "^1.1.1", "pretty-format": "^26.5.2", @@ -47486,9 +47971,9 @@ } }, "terser": { - "version": "5.19.2", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", - "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", + "version": "5.19.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", + "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -47805,6 +48290,11 @@ "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==", "dev": true }, + "triple-beam": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==" + }, "ts-interface-checker": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", @@ -50240,9 +50730,9 @@ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "yaml": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", - "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==" + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==" }, "yargs": { "version": "17.7.2", diff --git a/package.json b/package.json index fa3dfa2..acff28f 100644 --- a/package.json +++ b/package.json @@ -24,13 +24,14 @@ "@expo-google-fonts/roboto": "0.2.3", "@expo-google-fonts/rubik": "0.2.3", "@expo/cli": "^0.10.11", - "@ory/client": "1.1.46", + "@ory/client": "1.2.0", "@ory/themes": "0.0.21", "@react-native-async-storage/async-storage": "1.18.2", "@react-native-community/async-storage": "^1.12.1", "@react-native-community/masked-view": "^0.1.11", "@react-navigation/native": "~6.1.7", "@react-navigation/stack": "~6.3.17", + "@redtea/format-axios-error": "2.1.1", "@sentry/integrations": "7.64.0", "@sentry/react-native": "5.5.0", "@types/node": "~18.17.5", @@ -38,19 +39,19 @@ "expo": "^49.0.0", "expo-application": "~5.3.0", "expo-auth-session": "~5.0.2", - "expo-cli": "~6.0.6", + "expo-cli": "6.0.8", "expo-constants": "~14.4.2", "expo-device": "~5.4.0", "expo-linking": "~5.0.2", "expo-random": "~13.2.0", "expo-secure-store": "~12.3.1", "expo-status-bar": "~1.6.0", - "expo-updates": "~0.18.11", + "expo-updates": "~0.18.12", "expo-web-browser": "~12.3.2", "react": "18.2.0", "react-dom": "18.2.0", "react-is": "~17.0.1", - "react-native": "0.72.3", + "react-native": "0.72.4", "react-native-flash-message": "~0.1.17", "react-native-gesture-handler": "~2.12.0", "react-native-reanimated": "~3.3.0", diff --git a/src/helpers/axios.tsx b/src/helpers/axios.tsx index 174352b..d054fd8 100644 --- a/src/helpers/axios.tsx +++ b/src/helpers/axios.tsx @@ -1,6 +1,7 @@ // A small which adds retries to axios -import { AxiosError, AxiosInstance } from "axios" +import axios, { AxiosInstance } from "axios" +import { format } from "@redtea/format-axios-error" export const resilience = (axios: AxiosInstance) => { axios.interceptors.response.use( @@ -60,17 +61,36 @@ export const resilience = (axios: AxiosInstance) => { ) } -// TODO: remove once we upgrade axios -export function isAxiosError(e: any, status?: number): e is AxiosError { - return !!e?.isAxiosError && (!status || e.response?.status === status) +function containsGenericError( + data: unknown, +): data is { error: { id?: string } & Record } { + if (!data) { + return false + } + if (typeof data !== "object") { + return false + } + + if (!("error" in data)) { + return false + } + + const e = data.error + return typeof e === "object" && !!e } + export function logSDKError(e: unknown): void { - if (!isAxiosError(e)) { + if (!axios.isAxiosError(e)) { console.error("Something went wrong", JSON.stringify(e, null, 2)) return } const data = e.response?.data + if (!containsGenericError(data)) { + console.error("Something went wrong", format(e)) + return + } + let message = undefined switch (data.error.id) { case "self_service_flow_return_to_forbidden": @@ -80,8 +100,8 @@ export function logSDKError(e: unknown): void { } console.error( - message || data.error.message || "Something went wrong", - "\n", + message || data.error.reason || "Something went wrong", + "\n\n", "error details:", JSON.stringify(data.error, null, 2), ) diff --git a/src/helpers/form.tsx b/src/helpers/form.tsx index f085a42..4daaffa 100644 --- a/src/helpers/form.tsx +++ b/src/helpers/form.tsx @@ -14,11 +14,12 @@ import { VerificationFlow, } from "@ory/client" import { AxiosError } from "axios" +import * as AuthSession from "expo-auth-session" import * as WebBrowser from "expo-web-browser" import { showMessage } from "react-native-flash-message" import { SessionContext } from "./auth" +import { logSDKError } from "./axios" import { newOrySdk } from "./sdk" -import * as AuthSession from "expo-auth-session" type Flow = LoginFlow | RegistrationFlow | VerificationFlow | RecoveryFlow @@ -109,6 +110,7 @@ export function handleFormSubmitError< logout?: () => void, ) { return (err: AxiosError) => { + logSDKError(err) if (err.response) { switch (err.response.status) { case 400: @@ -177,7 +179,6 @@ export function handleFormSubmitError< } } - console.error(err, err.response?.data) return Promise.resolve() } } From 66539742e6e14f1f0d06208f0b5d29aa81c8e925 Mon Sep 17 00:00:00 2001 From: Jonas Hungershausen Date: Thu, 7 Sep 2023 15:20:12 +0200 Subject: [PATCH 4/6] chore: add more logs --- src/components/Routes/Recovery.tsx | 3 ++- src/components/Routes/Settings.tsx | 6 ++++-- src/components/Routes/Verification.tsx | 2 +- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/components/Routes/Recovery.tsx b/src/components/Routes/Recovery.tsx index 417068f..b4ddc5a 100644 --- a/src/components/Routes/Recovery.tsx +++ b/src/components/Routes/Recovery.tsx @@ -13,6 +13,7 @@ import { AuthContext } from "../AuthProvider" import NavigationCard from "../Styled/NavigationCard" import { isAxiosError } from "axios" import { handleFormSubmitError } from "../../helpers/form" +import { logSDKError } from "../../helpers/axios" type Props = StackScreenProps @@ -44,7 +45,7 @@ export default function Recovery({ navigation }: Props) { useFocusEffect( useCallback(() => { - initializeFlow().then(setFlow) + initializeFlow().then(setFlow).catch(logSDKError) return () => { setFlow(undefined) diff --git a/src/components/Routes/Settings.tsx b/src/components/Routes/Settings.tsx index c3facbc..85dc734 100644 --- a/src/components/Routes/Settings.tsx +++ b/src/components/Routes/Settings.tsx @@ -58,9 +58,11 @@ const Settings = ({ navigation, route }: Props) => { return } if (route?.params?.flowId) { - fetchFlow(sdk, sessionToken, route.params.flowId).then(setFlow) + fetchFlow(sdk, sessionToken, route.params.flowId) + .then(setFlow) + .catch(logSDKError) } else { - initializeFlow(sdk, sessionToken).then(setFlow) + initializeFlow(sdk, sessionToken).then(setFlow).catch(logSDKError) } }, [sdk, sessionToken]) diff --git a/src/components/Routes/Verification.tsx b/src/components/Routes/Verification.tsx index 6a2a458..993162a 100644 --- a/src/components/Routes/Verification.tsx +++ b/src/components/Routes/Verification.tsx @@ -35,7 +35,7 @@ export default function Verification({ navigation, route }: Props) { .then(({ data }) => { setFlow(data) }) - .catch(console.error) + .catch(logSDKError) // When the component is mounted, we initialize a new verification flow // or use the id provided by the route params to fetch that flow: From 47d492b17ce90490e644ba5e9ae31868a5418eac Mon Sep 17 00:00:00 2001 From: Jonas Hungershausen Date: Tue, 19 Sep 2023 15:13:35 +0200 Subject: [PATCH 5/6] chore: remove caret --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b67b3ad..40073ef 100644 --- a/package.json +++ b/package.json @@ -23,7 +23,7 @@ "dependencies": { "@expo-google-fonts/roboto": "0.2.3", "@expo-google-fonts/rubik": "0.2.3", - "@expo/webpack-config": "^19.0.0", + "@expo/webpack-config": "19.0.0", "@ory/client": "1.1.46", "@ory/themes": "0.0.21", "@react-native-async-storage/async-storage": "1.18.2", From 9441318e987d71cad4b15607b3a16f58f641dc57 Mon Sep 17 00:00:00 2001 From: Jonas Hungershausen Date: Tue, 19 Sep 2023 15:56:03 +0200 Subject: [PATCH 6/6] chore: cleanup --- Makefile | 3 +- contrib/sdk/typescript.yml | 2 + openapitools.json | 2 +- package-lock.json | 81 ++++++---------------------- package.json | 4 +- src/components/ErrorBoundary.tsx | 6 +-- src/components/Ory/Ui/Node/Input.tsx | 6 +-- src/components/Routes/Home.tsx | 19 ++++--- src/components/Routes/Recovery.tsx | 4 +- src/components/Routes/Settings.tsx | 19 +++---- src/helpers/sdk.tsx | 4 +- src/translations.ts | 49 ----------------- 12 files changed, 51 insertions(+), 148 deletions(-) delete mode 100644 src/translations.ts diff --git a/Makefile b/Makefile index eef552f..c3521f5 100644 --- a/Makefile +++ b/Makefile @@ -33,6 +33,7 @@ build-sdk: --git-repo-id sdk \ --git-host github.com \ -c ./contrib/sdk/typescript.yml - (cd ./contrib/sdk/generated; npm i; npm run build) + (cd ./contrib/sdk/generated; npm i; npm run build; npm link) make format npm i + npm link @ory/client diff --git a/contrib/sdk/typescript.yml b/contrib/sdk/typescript.yml index ef041f1..a7fbc1d 100644 --- a/contrib/sdk/typescript.yml +++ b/contrib/sdk/typescript.yml @@ -1,7 +1,9 @@ npmName: "@ory/client" npmVersion: v0.0.1 +# typescriptThreePlus: true supportsES6: true ensureUniqueParams: true modelPropertyNaming: original disallowAdditionalPropertiesIfNotPresent: false +withInterfaces: false useSingleRequestParameter: true diff --git a/openapitools.json b/openapitools.json index 0436938..9cbc6d5 100644 --- a/openapitools.json +++ b/openapitools.json @@ -2,6 +2,6 @@ "$schema": "./node_modules/@openapitools/openapi-generator-cli/config.schema.json", "spaces": 2, "generator-cli": { - "version": "6.4.0" + "version": "5.4.0" } } diff --git a/package-lock.json b/package-lock.json index b9e1976..12945c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,8 @@ "dependencies": { "@expo-google-fonts/roboto": "0.2.3", "@expo-google-fonts/rubik": "0.2.3", - "@expo/webpack-config": "^19.0.0", - "@ory/client": "1.1.46", + "@expo/webpack-config": "19.0.0", + "@ory/client": "1.2.4", "@ory/themes": "0.0.21", "@react-native-async-storage/async-storage": "1.18.2", "@react-native-community/async-storage": "1.12.1", @@ -22,7 +22,7 @@ "@sentry/integrations": "7.52.0", "@sentry/react-native": "5.5.0", "@types/node": "18.17.5", - "axios": "1.4.0", + "axios": "0.21.4", "expo": "49.0.10", "expo-application": "5.3.0", "expo-auth-session": "5.0.2", @@ -4163,21 +4163,13 @@ } }, "node_modules/@ory/client": { - "version": "1.1.46", - "resolved": "https://registry.npmjs.org/@ory/client/-/client-1.1.46.tgz", - "integrity": "sha512-+GK2Jo3g4gK/JY8XiZNp3blOQlGWlqCFVP8bYNrJ52erGvmYZQYabTXle/fFnwAuKhEn1ADH3kqi9nISye4rcg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@ory/client/-/client-1.2.4.tgz", + "integrity": "sha512-iA3HTzzNJtsotIAKO9Jo4eeZs4ElXnI3F0p7iqZhMq5rGubWxRv2SC+vLgGOhDevkzsVI2UXYAbkXxloUxai5A==", "dependencies": { "axios": "^0.21.4" } }, - "node_modules/@ory/client/node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/@ory/themes": { "version": "0.0.21", "resolved": "https://registry.npmjs.org/@ory/themes/-/themes-0.0.21.tgz", @@ -7556,26 +7548,11 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", - "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" + "follow-redirects": "^1.14.0" } }, "node_modules/babel-core": { @@ -22643,21 +22620,11 @@ } }, "@ory/client": { - "version": "1.1.46", - "resolved": "https://registry.npmjs.org/@ory/client/-/client-1.1.46.tgz", - "integrity": "sha512-+GK2Jo3g4gK/JY8XiZNp3blOQlGWlqCFVP8bYNrJ52erGvmYZQYabTXle/fFnwAuKhEn1ADH3kqi9nISye4rcg==", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@ory/client/-/client-1.2.4.tgz", + "integrity": "sha512-iA3HTzzNJtsotIAKO9Jo4eeZs4ElXnI3F0p7iqZhMq5rGubWxRv2SC+vLgGOhDevkzsVI2UXYAbkXxloUxai5A==", "requires": { "axios": "^0.21.4" - }, - "dependencies": { - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "requires": { - "follow-redirects": "^1.14.0" - } - } } }, "@ory/themes": { @@ -25264,25 +25231,11 @@ "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, "axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "requires": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - }, - "dependencies": { - "form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - } + "follow-redirects": "^1.14.0" } }, "babel-core": { diff --git a/package.json b/package.json index 40073ef..9678d4b 100644 --- a/package.json +++ b/package.json @@ -24,7 +24,7 @@ "@expo-google-fonts/roboto": "0.2.3", "@expo-google-fonts/rubik": "0.2.3", "@expo/webpack-config": "19.0.0", - "@ory/client": "1.1.46", + "@ory/client": "1.2.4", "@ory/themes": "0.0.21", "@react-native-async-storage/async-storage": "1.18.2", "@react-native-community/async-storage": "1.12.1", @@ -35,7 +35,7 @@ "@sentry/integrations": "7.52.0", "@sentry/react-native": "5.5.0", "@types/node": "18.17.5", - "axios": "1.4.0", + "axios": "0.21.4", "expo": "49.0.10", "expo-application": "5.3.0", "expo-auth-session": "5.0.2", diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx index 803e80b..345bd12 100644 --- a/src/components/ErrorBoundary.tsx +++ b/src/components/ErrorBoundary.tsx @@ -1,13 +1,11 @@ -import React, { Component, ErrorInfo } from "react" +import React, { Component, ErrorInfo, PropsWithChildren } from "react" import { Text } from "react-native" -interface Props {} - interface State { hasError: boolean } -export default class ErrorBoundary extends Component { +export default class ErrorBoundary extends Component { state = { hasError: false, } diff --git a/src/components/Ory/Ui/Node/Input.tsx b/src/components/Ory/Ui/Node/Input.tsx index 177bf52..9ecabd3 100644 --- a/src/components/Ory/Ui/Node/Input.tsx +++ b/src/components/Ory/Ui/Node/Input.tsx @@ -85,21 +85,21 @@ export const NodeInput = ({ let extraProps: TextInputProps = {} switch (variant) { case "email": - extraProps.autoCompleteType = "email" + extraProps.autoComplete = "email" extraProps.keyboardType = "email-address" extraProps.textContentType = "emailAddress" extraProps.autoCapitalize = "none" extraProps.autoCorrect = false break case "password": - extraProps.autoCompleteType = "password" + extraProps.autoComplete = "password" extraProps.textContentType = "password" extraProps.autoCapitalize = "none" extraProps.secureTextEntry = true extraProps.autoCorrect = false break case "username": - extraProps.autoCompleteType = "username" + extraProps.autoComplete = "username" extraProps.textContentType = "username" extraProps.autoCapitalize = "none" extraProps.autoCorrect = false diff --git a/src/components/Routes/Home.tsx b/src/components/Routes/Home.tsx index 02f28dd..fde0232 100644 --- a/src/components/Routes/Home.tsx +++ b/src/components/Routes/Home.tsx @@ -1,18 +1,20 @@ +import { StackScreenProps } from "@react-navigation/stack" import React, { useContext, useEffect } from "react" -import StyledText from "../Styled/StyledText" -import CodeBox from "../Styled/CodeBox" import { AuthContext } from "../AuthProvider" import Layout from "../Layout/Layout" +import { RootStackParamList } from "../Navigation" +import CodeBox from "../Styled/CodeBox" import StyledCard from "../Styled/StyledCard" -import { useNavigation } from "@react-navigation/native" +import StyledText from "../Styled/StyledText" + +type Props = StackScreenProps -const Home = () => { - const navigation = useNavigation() +const Home = ({ navigation }: Props) => { const { isAuthenticated, session, sessionToken } = useContext(AuthContext) useEffect(() => { if (!isAuthenticated || !session) { - navigation.navigate("Login") + navigation.navigate("Login", {}) } }, [isAuthenticated, sessionToken]) @@ -20,9 +22,10 @@ const Home = () => { return null } - const traits = session.identity.traits + const traits = session.identity?.traits + // Use the first name, the email, or the ID as the name - const first = traits.name?.first || traits.email || session.identity.id + const first = traits.name?.first || traits.email || session.identity?.id return ( diff --git a/src/components/Routes/Recovery.tsx b/src/components/Routes/Recovery.tsx index b4ddc5a..af6bbd4 100644 --- a/src/components/Routes/Recovery.tsx +++ b/src/components/Routes/Recovery.tsx @@ -11,9 +11,9 @@ import AuthSubTitle from "../Styled/AuthSubTitle" import StyledCard from "../Styled/StyledCard" import { AuthContext } from "../AuthProvider" import NavigationCard from "../Styled/NavigationCard" -import { isAxiosError } from "axios" import { handleFormSubmitError } from "../../helpers/form" import { logSDKError } from "../../helpers/axios" +import axios from "axios" type Props = StackScreenProps @@ -81,7 +81,7 @@ export default function Recovery({ navigation }: Props) { setFlow(updatedFlow) } } catch (err: unknown) { - if (isAxiosError(err)) { + if (axios.isAxiosError(err)) { handleFormSubmitError( flow, setFlow, diff --git a/src/components/Routes/Settings.tsx b/src/components/Routes/Settings.tsx index 85dc734..6974c5b 100644 --- a/src/components/Routes/Settings.tsx +++ b/src/components/Routes/Settings.tsx @@ -12,7 +12,6 @@ import { showMessage } from "react-native-flash-message" import styled from "styled-components/native" import { logSDKError } from "../../helpers/axios" import { handleFormSubmitError } from "../../helpers/form" -import { newOrySdk } from "../../helpers/sdk" import { AuthContext } from "../AuthProvider" import Layout from "../Layout/Layout" import { RootStackParamList } from "../Navigation" @@ -72,16 +71,14 @@ const Settings = ({ navigation, route }: Props) => { const onSuccess = (result: SettingsFlow) => { if (result.continue_with) { - if (result.continue_with) { - for (const c of result.continue_with) { - switch (c.action) { - case "show_verification_ui": { - console.log("got a verification flow, navigating to it", c) - navigation.navigate("Verification", { - flowId: c.flow.id, - }) - break - } + for (const c of result.continue_with) { + switch (c.action) { + case "show_verification_ui": { + console.log("got a verification flow, navigating to it", c) + navigation.navigate("Verification", { + flowId: c.flow.id, + }) + break } } } diff --git a/src/helpers/sdk.tsx b/src/helpers/sdk.tsx index 283bb60..49d94a3 100644 --- a/src/helpers/sdk.tsx +++ b/src/helpers/sdk.tsx @@ -1,9 +1,7 @@ import { Configuration, FrontendApi } from "@ory/client" -import axiosFactory from "axios" +import axios from "axios" import Constants from "expo-constants" -const axios = axiosFactory.create() - // canonicalize removes the trailing slash from URLs. const canonicalize = (url: string = "") => url.replace(/\/+$/, "") diff --git a/src/translations.ts b/src/translations.ts deleted file mode 100644 index 874addf..0000000 --- a/src/translations.ts +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright © 2023 Ory Corp -// SPDX-License-Identifier: Apache-2.0 - -import { FormField } from "@ory/kratos-client" - -const translations = { - password: { - title: "Password", - position: 2, - }, - "traits.email": { - title: "E-Mail", - position: 1, - }, - "traits.name.first": { - title: "First Name", - position: 2, - }, - "traits.name.last": { - title: "Last Name", - position: 3, - }, - "traits.name.birthday": { - title: "My Birthday", - position: 4, - }, - "traits.website": { - title: "Website", - position: 4, - }, - identifier: { - title: "E-Mail", - position: 0, - }, - to_verify: { - title: "Your email address", - position: 0, - }, -} - -type Translations = typeof translations - -export const getTitle = (key: string): string => - key in translations ? translations[key as keyof Translations].title : key - -export const getPosition = (field: FormField) => - field.name && field.name in translations - ? translations[field.name as keyof Translations].position - : Infinity