@better-auth/expo 1.3.18 → 1.3.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.cjs CHANGED
@@ -187,7 +187,8 @@ const expoClient = (opts) => {
187
187
  }
188
188
  );
189
189
  }
190
- const result = await Browser.openAuthSessionAsync(signInURL, to);
190
+ const proxyURL = `${context.request.baseURL}/expo-authorization-proxy?authorizationURL=${encodeURIComponent(signInURL)}`;
191
+ const result = await Browser.openAuthSessionAsync(proxyURL, to);
191
192
  if (result.type !== "success") return;
192
193
  const url = new URL(result.url);
193
194
  const cookie = String(url.searchParams.get("cookie"));
package/dist/client.mjs CHANGED
@@ -168,7 +168,8 @@ const expoClient = (opts) => {
168
168
  }
169
169
  );
170
170
  }
171
- const result = await Browser.openAuthSessionAsync(signInURL, to);
171
+ const proxyURL = `${context.request.baseURL}/expo-authorization-proxy?authorizationURL=${encodeURIComponent(signInURL)}`;
172
+ const result = await Browser.openAuthSessionAsync(proxyURL, to);
172
173
  if (result.type !== "success") return;
173
174
  const url = new URL(result.url);
174
175
  const cookie = String(url.searchParams.get("cookie"));
package/dist/index.cjs CHANGED
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  const api = require('better-auth/api');
4
+ const zod = require('zod');
4
5
 
5
6
  const expo = (options) => {
6
7
  return {
@@ -62,6 +63,41 @@ const expo = (options) => {
62
63
  })
63
64
  }
64
65
  ]
66
+ },
67
+ endpoints: {
68
+ expoAuthorizationProxy: api.createAuthEndpoint(
69
+ "/expo-authorization-proxy",
70
+ {
71
+ method: "GET",
72
+ query: zod.z.object({
73
+ authorizationURL: zod.z.string()
74
+ }),
75
+ metadata: {
76
+ isAction: false
77
+ }
78
+ },
79
+ async (ctx) => {
80
+ const { authorizationURL } = ctx.query;
81
+ const url = new URL(authorizationURL);
82
+ const state = url.searchParams.get("state");
83
+ if (!state) {
84
+ throw new api.APIError("BAD_REQUEST", {
85
+ message: "Unexpected error"
86
+ });
87
+ }
88
+ const stateCookie = ctx.context.createAuthCookie("state", {
89
+ maxAge: 5 * 60 * 1e3
90
+ // 5 minutes
91
+ });
92
+ await ctx.setSignedCookie(
93
+ stateCookie.name,
94
+ state,
95
+ ctx.context.secret,
96
+ stateCookie.attributes
97
+ );
98
+ return ctx.redirect(ctx.query.authorizationURL);
99
+ }
100
+ )
65
101
  }
66
102
  };
67
103
  };
package/dist/index.d.cts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as better_call from 'better-call';
2
2
  import * as better_auth_types from 'better-auth/types';
3
+ import { z } from 'zod';
3
4
 
4
5
  interface ExpoOptions {
5
6
  /**
@@ -23,6 +24,74 @@ declare const expo: (options?: ExpoOptions) => {
23
24
  handler: (inputContext: better_call.MiddlewareInputContext<better_call.MiddlewareOptions>) => Promise<void>;
24
25
  }[];
25
26
  };
27
+ endpoints: {
28
+ expoAuthorizationProxy: {
29
+ <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0: {
30
+ body?: undefined;
31
+ } & {
32
+ method?: "GET" | undefined;
33
+ } & {
34
+ query: {
35
+ authorizationURL: string;
36
+ };
37
+ } & {
38
+ params?: Record<string, any>;
39
+ } & {
40
+ request?: Request;
41
+ } & {
42
+ headers?: HeadersInit;
43
+ } & {
44
+ asResponse?: boolean;
45
+ returnHeaders?: boolean;
46
+ use?: better_call.Middleware[];
47
+ path?: string;
48
+ } & {
49
+ asResponse?: AsResponse | undefined;
50
+ returnHeaders?: ReturnHeaders | undefined;
51
+ }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? {
52
+ headers: Headers;
53
+ response: {
54
+ status: ("OK" | "CREATED" | "ACCEPTED" | "NO_CONTENT" | "MULTIPLE_CHOICES" | "MOVED_PERMANENTLY" | "FOUND" | "SEE_OTHER" | "NOT_MODIFIED" | "TEMPORARY_REDIRECT" | "BAD_REQUEST" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "PROXY_AUTHENTICATION_REQUIRED" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "LENGTH_REQUIRED" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "URI_TOO_LONG" | "UNSUPPORTED_MEDIA_TYPE" | "RANGE_NOT_SATISFIABLE" | "EXPECTATION_FAILED" | "I'M_A_TEAPOT" | "MISDIRECTED_REQUEST" | "UNPROCESSABLE_ENTITY" | "LOCKED" | "FAILED_DEPENDENCY" | "TOO_EARLY" | "UPGRADE_REQUIRED" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "REQUEST_HEADER_FIELDS_TOO_LARGE" | "UNAVAILABLE_FOR_LEGAL_REASONS" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "HTTP_VERSION_NOT_SUPPORTED" | "VARIANT_ALSO_NEGOTIATES" | "INSUFFICIENT_STORAGE" | "LOOP_DETECTED" | "NOT_EXTENDED" | "NETWORK_AUTHENTICATION_REQUIRED") | better_call.Status;
55
+ body: ({
56
+ message?: string;
57
+ code?: string;
58
+ cause?: unknown;
59
+ } & Record<string, any>) | undefined;
60
+ headers: HeadersInit;
61
+ statusCode: number;
62
+ name: string;
63
+ message: string;
64
+ stack?: string;
65
+ cause?: unknown;
66
+ };
67
+ } : {
68
+ status: ("OK" | "CREATED" | "ACCEPTED" | "NO_CONTENT" | "MULTIPLE_CHOICES" | "MOVED_PERMANENTLY" | "FOUND" | "SEE_OTHER" | "NOT_MODIFIED" | "TEMPORARY_REDIRECT" | "BAD_REQUEST" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "PROXY_AUTHENTICATION_REQUIRED" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "LENGTH_REQUIRED" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "URI_TOO_LONG" | "UNSUPPORTED_MEDIA_TYPE" | "RANGE_NOT_SATISFIABLE" | "EXPECTATION_FAILED" | "I'M_A_TEAPOT" | "MISDIRECTED_REQUEST" | "UNPROCESSABLE_ENTITY" | "LOCKED" | "FAILED_DEPENDENCY" | "TOO_EARLY" | "UPGRADE_REQUIRED" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "REQUEST_HEADER_FIELDS_TOO_LARGE" | "UNAVAILABLE_FOR_LEGAL_REASONS" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "HTTP_VERSION_NOT_SUPPORTED" | "VARIANT_ALSO_NEGOTIATES" | "INSUFFICIENT_STORAGE" | "LOOP_DETECTED" | "NOT_EXTENDED" | "NETWORK_AUTHENTICATION_REQUIRED") | better_call.Status;
69
+ body: ({
70
+ message?: string;
71
+ code?: string;
72
+ cause?: unknown;
73
+ } & Record<string, any>) | undefined;
74
+ headers: HeadersInit;
75
+ statusCode: number;
76
+ name: string;
77
+ message: string;
78
+ stack?: string;
79
+ cause?: unknown;
80
+ }>;
81
+ options: {
82
+ method: "GET";
83
+ query: z.ZodObject<{
84
+ authorizationURL: z.ZodString;
85
+ }, z.core.$strip>;
86
+ metadata: {
87
+ isAction: boolean;
88
+ };
89
+ } & {
90
+ use: any[];
91
+ };
92
+ path: "/expo-authorization-proxy";
93
+ };
94
+ };
26
95
  };
27
96
 
28
97
  export { expo };
package/dist/index.d.mts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as better_call from 'better-call';
2
2
  import * as better_auth_types from 'better-auth/types';
3
+ import { z } from 'zod';
3
4
 
4
5
  interface ExpoOptions {
5
6
  /**
@@ -23,6 +24,74 @@ declare const expo: (options?: ExpoOptions) => {
23
24
  handler: (inputContext: better_call.MiddlewareInputContext<better_call.MiddlewareOptions>) => Promise<void>;
24
25
  }[];
25
26
  };
27
+ endpoints: {
28
+ expoAuthorizationProxy: {
29
+ <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0: {
30
+ body?: undefined;
31
+ } & {
32
+ method?: "GET" | undefined;
33
+ } & {
34
+ query: {
35
+ authorizationURL: string;
36
+ };
37
+ } & {
38
+ params?: Record<string, any>;
39
+ } & {
40
+ request?: Request;
41
+ } & {
42
+ headers?: HeadersInit;
43
+ } & {
44
+ asResponse?: boolean;
45
+ returnHeaders?: boolean;
46
+ use?: better_call.Middleware[];
47
+ path?: string;
48
+ } & {
49
+ asResponse?: AsResponse | undefined;
50
+ returnHeaders?: ReturnHeaders | undefined;
51
+ }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? {
52
+ headers: Headers;
53
+ response: {
54
+ status: ("OK" | "CREATED" | "ACCEPTED" | "NO_CONTENT" | "MULTIPLE_CHOICES" | "MOVED_PERMANENTLY" | "FOUND" | "SEE_OTHER" | "NOT_MODIFIED" | "TEMPORARY_REDIRECT" | "BAD_REQUEST" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "PROXY_AUTHENTICATION_REQUIRED" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "LENGTH_REQUIRED" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "URI_TOO_LONG" | "UNSUPPORTED_MEDIA_TYPE" | "RANGE_NOT_SATISFIABLE" | "EXPECTATION_FAILED" | "I'M_A_TEAPOT" | "MISDIRECTED_REQUEST" | "UNPROCESSABLE_ENTITY" | "LOCKED" | "FAILED_DEPENDENCY" | "TOO_EARLY" | "UPGRADE_REQUIRED" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "REQUEST_HEADER_FIELDS_TOO_LARGE" | "UNAVAILABLE_FOR_LEGAL_REASONS" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "HTTP_VERSION_NOT_SUPPORTED" | "VARIANT_ALSO_NEGOTIATES" | "INSUFFICIENT_STORAGE" | "LOOP_DETECTED" | "NOT_EXTENDED" | "NETWORK_AUTHENTICATION_REQUIRED") | better_call.Status;
55
+ body: ({
56
+ message?: string;
57
+ code?: string;
58
+ cause?: unknown;
59
+ } & Record<string, any>) | undefined;
60
+ headers: HeadersInit;
61
+ statusCode: number;
62
+ name: string;
63
+ message: string;
64
+ stack?: string;
65
+ cause?: unknown;
66
+ };
67
+ } : {
68
+ status: ("OK" | "CREATED" | "ACCEPTED" | "NO_CONTENT" | "MULTIPLE_CHOICES" | "MOVED_PERMANENTLY" | "FOUND" | "SEE_OTHER" | "NOT_MODIFIED" | "TEMPORARY_REDIRECT" | "BAD_REQUEST" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "PROXY_AUTHENTICATION_REQUIRED" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "LENGTH_REQUIRED" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "URI_TOO_LONG" | "UNSUPPORTED_MEDIA_TYPE" | "RANGE_NOT_SATISFIABLE" | "EXPECTATION_FAILED" | "I'M_A_TEAPOT" | "MISDIRECTED_REQUEST" | "UNPROCESSABLE_ENTITY" | "LOCKED" | "FAILED_DEPENDENCY" | "TOO_EARLY" | "UPGRADE_REQUIRED" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "REQUEST_HEADER_FIELDS_TOO_LARGE" | "UNAVAILABLE_FOR_LEGAL_REASONS" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "HTTP_VERSION_NOT_SUPPORTED" | "VARIANT_ALSO_NEGOTIATES" | "INSUFFICIENT_STORAGE" | "LOOP_DETECTED" | "NOT_EXTENDED" | "NETWORK_AUTHENTICATION_REQUIRED") | better_call.Status;
69
+ body: ({
70
+ message?: string;
71
+ code?: string;
72
+ cause?: unknown;
73
+ } & Record<string, any>) | undefined;
74
+ headers: HeadersInit;
75
+ statusCode: number;
76
+ name: string;
77
+ message: string;
78
+ stack?: string;
79
+ cause?: unknown;
80
+ }>;
81
+ options: {
82
+ method: "GET";
83
+ query: z.ZodObject<{
84
+ authorizationURL: z.ZodString;
85
+ }, z.core.$strip>;
86
+ metadata: {
87
+ isAction: boolean;
88
+ };
89
+ } & {
90
+ use: any[];
91
+ };
92
+ path: "/expo-authorization-proxy";
93
+ };
94
+ };
26
95
  };
27
96
 
28
97
  export { expo };
package/dist/index.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import * as better_call from 'better-call';
2
2
  import * as better_auth_types from 'better-auth/types';
3
+ import { z } from 'zod';
3
4
 
4
5
  interface ExpoOptions {
5
6
  /**
@@ -23,6 +24,74 @@ declare const expo: (options?: ExpoOptions) => {
23
24
  handler: (inputContext: better_call.MiddlewareInputContext<better_call.MiddlewareOptions>) => Promise<void>;
24
25
  }[];
25
26
  };
27
+ endpoints: {
28
+ expoAuthorizationProxy: {
29
+ <AsResponse extends boolean = false, ReturnHeaders extends boolean = false>(inputCtx_0: {
30
+ body?: undefined;
31
+ } & {
32
+ method?: "GET" | undefined;
33
+ } & {
34
+ query: {
35
+ authorizationURL: string;
36
+ };
37
+ } & {
38
+ params?: Record<string, any>;
39
+ } & {
40
+ request?: Request;
41
+ } & {
42
+ headers?: HeadersInit;
43
+ } & {
44
+ asResponse?: boolean;
45
+ returnHeaders?: boolean;
46
+ use?: better_call.Middleware[];
47
+ path?: string;
48
+ } & {
49
+ asResponse?: AsResponse | undefined;
50
+ returnHeaders?: ReturnHeaders | undefined;
51
+ }): Promise<[AsResponse] extends [true] ? Response : [ReturnHeaders] extends [true] ? {
52
+ headers: Headers;
53
+ response: {
54
+ status: ("OK" | "CREATED" | "ACCEPTED" | "NO_CONTENT" | "MULTIPLE_CHOICES" | "MOVED_PERMANENTLY" | "FOUND" | "SEE_OTHER" | "NOT_MODIFIED" | "TEMPORARY_REDIRECT" | "BAD_REQUEST" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "PROXY_AUTHENTICATION_REQUIRED" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "LENGTH_REQUIRED" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "URI_TOO_LONG" | "UNSUPPORTED_MEDIA_TYPE" | "RANGE_NOT_SATISFIABLE" | "EXPECTATION_FAILED" | "I'M_A_TEAPOT" | "MISDIRECTED_REQUEST" | "UNPROCESSABLE_ENTITY" | "LOCKED" | "FAILED_DEPENDENCY" | "TOO_EARLY" | "UPGRADE_REQUIRED" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "REQUEST_HEADER_FIELDS_TOO_LARGE" | "UNAVAILABLE_FOR_LEGAL_REASONS" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "HTTP_VERSION_NOT_SUPPORTED" | "VARIANT_ALSO_NEGOTIATES" | "INSUFFICIENT_STORAGE" | "LOOP_DETECTED" | "NOT_EXTENDED" | "NETWORK_AUTHENTICATION_REQUIRED") | better_call.Status;
55
+ body: ({
56
+ message?: string;
57
+ code?: string;
58
+ cause?: unknown;
59
+ } & Record<string, any>) | undefined;
60
+ headers: HeadersInit;
61
+ statusCode: number;
62
+ name: string;
63
+ message: string;
64
+ stack?: string;
65
+ cause?: unknown;
66
+ };
67
+ } : {
68
+ status: ("OK" | "CREATED" | "ACCEPTED" | "NO_CONTENT" | "MULTIPLE_CHOICES" | "MOVED_PERMANENTLY" | "FOUND" | "SEE_OTHER" | "NOT_MODIFIED" | "TEMPORARY_REDIRECT" | "BAD_REQUEST" | "UNAUTHORIZED" | "PAYMENT_REQUIRED" | "FORBIDDEN" | "NOT_FOUND" | "METHOD_NOT_ALLOWED" | "NOT_ACCEPTABLE" | "PROXY_AUTHENTICATION_REQUIRED" | "REQUEST_TIMEOUT" | "CONFLICT" | "GONE" | "LENGTH_REQUIRED" | "PRECONDITION_FAILED" | "PAYLOAD_TOO_LARGE" | "URI_TOO_LONG" | "UNSUPPORTED_MEDIA_TYPE" | "RANGE_NOT_SATISFIABLE" | "EXPECTATION_FAILED" | "I'M_A_TEAPOT" | "MISDIRECTED_REQUEST" | "UNPROCESSABLE_ENTITY" | "LOCKED" | "FAILED_DEPENDENCY" | "TOO_EARLY" | "UPGRADE_REQUIRED" | "PRECONDITION_REQUIRED" | "TOO_MANY_REQUESTS" | "REQUEST_HEADER_FIELDS_TOO_LARGE" | "UNAVAILABLE_FOR_LEGAL_REASONS" | "INTERNAL_SERVER_ERROR" | "NOT_IMPLEMENTED" | "BAD_GATEWAY" | "SERVICE_UNAVAILABLE" | "GATEWAY_TIMEOUT" | "HTTP_VERSION_NOT_SUPPORTED" | "VARIANT_ALSO_NEGOTIATES" | "INSUFFICIENT_STORAGE" | "LOOP_DETECTED" | "NOT_EXTENDED" | "NETWORK_AUTHENTICATION_REQUIRED") | better_call.Status;
69
+ body: ({
70
+ message?: string;
71
+ code?: string;
72
+ cause?: unknown;
73
+ } & Record<string, any>) | undefined;
74
+ headers: HeadersInit;
75
+ statusCode: number;
76
+ name: string;
77
+ message: string;
78
+ stack?: string;
79
+ cause?: unknown;
80
+ }>;
81
+ options: {
82
+ method: "GET";
83
+ query: z.ZodObject<{
84
+ authorizationURL: z.ZodString;
85
+ }, z.core.$strip>;
86
+ metadata: {
87
+ isAction: boolean;
88
+ };
89
+ } & {
90
+ use: any[];
91
+ };
92
+ path: "/expo-authorization-proxy";
93
+ };
94
+ };
26
95
  };
27
96
 
28
97
  export { expo };
package/dist/index.mjs CHANGED
@@ -1,4 +1,5 @@
1
- import { createAuthMiddleware } from 'better-auth/api';
1
+ import { createAuthEndpoint, createAuthMiddleware, APIError } from 'better-auth/api';
2
+ import { z } from 'zod';
2
3
 
3
4
  const expo = (options) => {
4
5
  return {
@@ -60,6 +61,41 @@ const expo = (options) => {
60
61
  })
61
62
  }
62
63
  ]
64
+ },
65
+ endpoints: {
66
+ expoAuthorizationProxy: createAuthEndpoint(
67
+ "/expo-authorization-proxy",
68
+ {
69
+ method: "GET",
70
+ query: z.object({
71
+ authorizationURL: z.string()
72
+ }),
73
+ metadata: {
74
+ isAction: false
75
+ }
76
+ },
77
+ async (ctx) => {
78
+ const { authorizationURL } = ctx.query;
79
+ const url = new URL(authorizationURL);
80
+ const state = url.searchParams.get("state");
81
+ if (!state) {
82
+ throw new APIError("BAD_REQUEST", {
83
+ message: "Unexpected error"
84
+ });
85
+ }
86
+ const stateCookie = ctx.context.createAuthCookie("state", {
87
+ maxAge: 5 * 60 * 1e3
88
+ // 5 minutes
89
+ });
90
+ await ctx.setSignedCookie(
91
+ stateCookie.name,
92
+ state,
93
+ ctx.context.secret,
94
+ stateCookie.attributes
95
+ );
96
+ return ctx.redirect(ctx.query.authorizationURL);
97
+ }
98
+ )
63
99
  }
64
100
  };
65
101
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@better-auth/expo",
3
- "version": "1.3.18",
3
+ "version": "1.3.22",
4
4
  "description": "",
5
5
  "main": "dist/index.cjs",
6
6
  "module": "dist/index.mjs",
@@ -54,7 +54,7 @@
54
54
  "expo-web-browser": "~14.2.0",
55
55
  "react-native": "~0.80.2",
56
56
  "unbuild": "^3.6.1",
57
- "better-auth": "1.3.18"
57
+ "better-auth": "1.3.22"
58
58
  },
59
59
  "peerDependencies": {
60
60
  "expo-constants": ">=17.0.0",
@@ -62,10 +62,11 @@
62
62
  "expo-linking": ">=7.0.0",
63
63
  "expo-secure-store": ">=14.0.0",
64
64
  "expo-web-browser": ">=14.0.0",
65
- "better-auth": "1.3.18"
65
+ "better-auth": "1.3.22"
66
66
  },
67
67
  "dependencies": {
68
- "@better-fetch/fetch": "^1.1.18"
68
+ "@better-fetch/fetch": "^1.1.18",
69
+ "zod": "^4.1.5"
69
70
  },
70
71
  "files": [
71
72
  "dist"