@terreno/rtk 0.1.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/betterAuthClient.d.ts +734 -0
- package/dist/betterAuthClient.d.ts.map +1 -0
- package/dist/betterAuthClient.js +79 -0
- package/dist/betterAuthClient.js.map +1 -0
- package/dist/betterAuthSlice.d.ts +338 -0
- package/dist/betterAuthSlice.d.ts.map +1 -0
- package/dist/betterAuthSlice.js +220 -0
- package/dist/betterAuthSlice.js.map +1 -0
- package/dist/betterAuthSlice.test.d.ts +2 -0
- package/dist/betterAuthSlice.test.d.ts.map +1 -0
- package/dist/betterAuthSlice.test.js +258 -0
- package/dist/betterAuthSlice.test.js.map +1 -0
- package/dist/betterAuthTypes.d.ts +74 -0
- package/dist/betterAuthTypes.d.ts.map +1 -0
- package/dist/betterAuthTypes.js +8 -0
- package/dist/betterAuthTypes.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/package.json +6 -2
- package/src/betterAuthClient.ts +107 -0
- package/src/betterAuthSlice.test.ts +329 -0
- package/src/betterAuthSlice.ts +307 -0
- package/src/betterAuthTypes.ts +81 -0
- package/src/index.ts +3 -0
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it, mock } from "bun:test";
|
|
2
|
+
import { generateBetterAuthSlice, selectBetterAuthError, selectBetterAuthIsAuthenticated, selectBetterAuthIsLoading, selectBetterAuthUser, selectBetterAuthUserId, } from "./betterAuthSlice";
|
|
3
|
+
// Mock Better Auth client
|
|
4
|
+
const createMockAuthClient = () => ({
|
|
5
|
+
getSession: mock(() => Promise.resolve({
|
|
6
|
+
data: {
|
|
7
|
+
session: {
|
|
8
|
+
createdAt: new Date(),
|
|
9
|
+
expiresAt: new Date(Date.now() + 3600000),
|
|
10
|
+
id: "session-456",
|
|
11
|
+
ipAddress: null,
|
|
12
|
+
updatedAt: new Date(),
|
|
13
|
+
userAgent: null,
|
|
14
|
+
userId: "user-123",
|
|
15
|
+
},
|
|
16
|
+
user: {
|
|
17
|
+
createdAt: new Date(),
|
|
18
|
+
email: "test@example.com",
|
|
19
|
+
emailVerified: true,
|
|
20
|
+
id: "user-123",
|
|
21
|
+
image: null,
|
|
22
|
+
name: "Test User",
|
|
23
|
+
updatedAt: new Date(),
|
|
24
|
+
},
|
|
25
|
+
},
|
|
26
|
+
})),
|
|
27
|
+
signIn: {
|
|
28
|
+
email: mock(() => Promise.resolve({ data: { user: { id: "user-123" } } })),
|
|
29
|
+
social: mock(() => Promise.resolve({ data: { user: { id: "user-123" } } })),
|
|
30
|
+
},
|
|
31
|
+
signOut: mock(() => Promise.resolve()),
|
|
32
|
+
signUp: {
|
|
33
|
+
email: mock(() => Promise.resolve({ data: { user: { id: "user-123" } } })),
|
|
34
|
+
},
|
|
35
|
+
});
|
|
36
|
+
describe("BetterAuthClientConfig", () => {
|
|
37
|
+
it("defines config interface correctly", () => {
|
|
38
|
+
const config = {
|
|
39
|
+
baseURL: "http://localhost:3000",
|
|
40
|
+
scheme: "terreno",
|
|
41
|
+
storagePrefix: "myapp",
|
|
42
|
+
};
|
|
43
|
+
expect(config.baseURL).toBe("http://localhost:3000");
|
|
44
|
+
expect(config.scheme).toBe("terreno");
|
|
45
|
+
expect(config.storagePrefix).toBe("myapp");
|
|
46
|
+
});
|
|
47
|
+
it("allows minimal config without storagePrefix", () => {
|
|
48
|
+
const config = {
|
|
49
|
+
baseURL: "http://localhost:3000",
|
|
50
|
+
scheme: "terreno",
|
|
51
|
+
};
|
|
52
|
+
expect(config.storagePrefix).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
describe("generateBetterAuthSlice", () => {
|
|
56
|
+
let mockAuthClient;
|
|
57
|
+
beforeEach(() => {
|
|
58
|
+
mockAuthClient = createMockAuthClient();
|
|
59
|
+
});
|
|
60
|
+
it("creates a slice with initial state", () => {
|
|
61
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
62
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
63
|
+
const initialState = betterAuthSlice.reducer(undefined, { type: "@@INIT" });
|
|
64
|
+
expect(initialState.isAuthenticated).toBe(false);
|
|
65
|
+
expect(initialState.userId).toBeNull();
|
|
66
|
+
expect(initialState.user).toBeNull();
|
|
67
|
+
expect(initialState.isLoading).toBe(true);
|
|
68
|
+
expect(initialState.error).toBeNull();
|
|
69
|
+
});
|
|
70
|
+
it("setSession action updates state correctly", () => {
|
|
71
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
72
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
73
|
+
const user = {
|
|
74
|
+
createdAt: new Date(),
|
|
75
|
+
email: "test@example.com",
|
|
76
|
+
emailVerified: true,
|
|
77
|
+
id: "user-123",
|
|
78
|
+
image: null,
|
|
79
|
+
name: "Test User",
|
|
80
|
+
updatedAt: new Date(),
|
|
81
|
+
};
|
|
82
|
+
const state = betterAuthSlice.reducer(undefined, betterAuthSlice.actions.setSession({ user, userId: "user-123" }));
|
|
83
|
+
expect(state.isAuthenticated).toBe(true);
|
|
84
|
+
expect(state.userId).toBe("user-123");
|
|
85
|
+
expect(state.user?.email).toBe("test@example.com");
|
|
86
|
+
expect(state.isLoading).toBe(false);
|
|
87
|
+
expect(state.error).toBeNull();
|
|
88
|
+
});
|
|
89
|
+
it("clearSession action resets state", () => {
|
|
90
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
91
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
92
|
+
// First set a session
|
|
93
|
+
let state = betterAuthSlice.reducer(undefined, betterAuthSlice.actions.setSession({
|
|
94
|
+
user: {
|
|
95
|
+
createdAt: new Date(),
|
|
96
|
+
email: "test@example.com",
|
|
97
|
+
emailVerified: true,
|
|
98
|
+
id: "user-123",
|
|
99
|
+
image: null,
|
|
100
|
+
name: "Test",
|
|
101
|
+
updatedAt: new Date(),
|
|
102
|
+
},
|
|
103
|
+
userId: "user-123",
|
|
104
|
+
}));
|
|
105
|
+
// Then clear it
|
|
106
|
+
state = betterAuthSlice.reducer(state, betterAuthSlice.actions.clearSession());
|
|
107
|
+
expect(state.isAuthenticated).toBe(false);
|
|
108
|
+
expect(state.userId).toBeNull();
|
|
109
|
+
expect(state.user).toBeNull();
|
|
110
|
+
});
|
|
111
|
+
it("setLoading action updates loading state", () => {
|
|
112
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
113
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
114
|
+
let state = betterAuthSlice.reducer(undefined, betterAuthSlice.actions.setLoading(true));
|
|
115
|
+
expect(state.isLoading).toBe(true);
|
|
116
|
+
state = betterAuthSlice.reducer(state, betterAuthSlice.actions.setLoading(false));
|
|
117
|
+
expect(state.isLoading).toBe(false);
|
|
118
|
+
});
|
|
119
|
+
it("setError action updates error state", () => {
|
|
120
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
121
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
122
|
+
const state = betterAuthSlice.reducer(undefined, betterAuthSlice.actions.setError("Something went wrong"));
|
|
123
|
+
expect(state.error).toBe("Something went wrong");
|
|
124
|
+
expect(state.isLoading).toBe(false);
|
|
125
|
+
});
|
|
126
|
+
it("logout action clears session state", () => {
|
|
127
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
128
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
129
|
+
// First set a session
|
|
130
|
+
let state = betterAuthSlice.reducer(undefined, betterAuthSlice.actions.setSession({
|
|
131
|
+
user: {
|
|
132
|
+
createdAt: new Date(),
|
|
133
|
+
email: "test@example.com",
|
|
134
|
+
emailVerified: true,
|
|
135
|
+
id: "user-123",
|
|
136
|
+
image: null,
|
|
137
|
+
name: "Test",
|
|
138
|
+
updatedAt: new Date(),
|
|
139
|
+
},
|
|
140
|
+
userId: "user-123",
|
|
141
|
+
}));
|
|
142
|
+
// Then logout
|
|
143
|
+
state = betterAuthSlice.reducer(state, betterAuthSlice.actions.logout());
|
|
144
|
+
expect(state.isAuthenticated).toBe(false);
|
|
145
|
+
expect(state.userId).toBeNull();
|
|
146
|
+
expect(state.user).toBeNull();
|
|
147
|
+
});
|
|
148
|
+
it("returns middleware array", () => {
|
|
149
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
150
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
151
|
+
expect(Array.isArray(betterAuthSlice.middleware)).toBe(true);
|
|
152
|
+
expect(betterAuthSlice.middleware.length).toBeGreaterThan(0);
|
|
153
|
+
});
|
|
154
|
+
it("returns authClient reference", () => {
|
|
155
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
156
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
157
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type comparison
|
|
158
|
+
expect(betterAuthSlice.authClient).toBe(mockAuthClient);
|
|
159
|
+
});
|
|
160
|
+
it("syncSession function updates state from auth client", async () => {
|
|
161
|
+
// biome-ignore lint/suspicious/noExplicitAny: Mock client type
|
|
162
|
+
const betterAuthSlice = generateBetterAuthSlice({ authClient: mockAuthClient });
|
|
163
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test mock for dispatched actions
|
|
164
|
+
const dispatchedActions = [];
|
|
165
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test mock dispatch function
|
|
166
|
+
const mockDispatch = (action) => {
|
|
167
|
+
dispatchedActions.push(action);
|
|
168
|
+
};
|
|
169
|
+
await betterAuthSlice.syncSession(mockDispatch);
|
|
170
|
+
// Should dispatch setLoading(true) then setSession
|
|
171
|
+
expect(dispatchedActions.length).toBeGreaterThanOrEqual(2);
|
|
172
|
+
expect(dispatchedActions[0].type).toBe("betterAuth/setLoading");
|
|
173
|
+
});
|
|
174
|
+
});
|
|
175
|
+
describe("Better Auth selectors", () => {
|
|
176
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test mock state factory
|
|
177
|
+
const createMockState = (betterAuth = {}) => ({
|
|
178
|
+
betterAuth: {
|
|
179
|
+
error: null,
|
|
180
|
+
isAuthenticated: false,
|
|
181
|
+
isLoading: false,
|
|
182
|
+
lastSyncTimestamp: null,
|
|
183
|
+
user: null,
|
|
184
|
+
userId: null,
|
|
185
|
+
...betterAuth,
|
|
186
|
+
},
|
|
187
|
+
});
|
|
188
|
+
it("selectBetterAuthIsAuthenticated returns correct value", () => {
|
|
189
|
+
expect(selectBetterAuthIsAuthenticated(createMockState({ isAuthenticated: true }))).toBe(true);
|
|
190
|
+
expect(selectBetterAuthIsAuthenticated(createMockState({ isAuthenticated: false }))).toBe(false);
|
|
191
|
+
});
|
|
192
|
+
it("selectBetterAuthUserId returns correct value", () => {
|
|
193
|
+
expect(selectBetterAuthUserId(createMockState({ userId: "user-123" }))).toBe("user-123");
|
|
194
|
+
expect(selectBetterAuthUserId(createMockState({ userId: null }))).toBeNull();
|
|
195
|
+
});
|
|
196
|
+
it("selectBetterAuthUser returns correct value", () => {
|
|
197
|
+
const user = {
|
|
198
|
+
createdAt: new Date(),
|
|
199
|
+
email: "test@example.com",
|
|
200
|
+
emailVerified: true,
|
|
201
|
+
id: "user-123",
|
|
202
|
+
image: null,
|
|
203
|
+
name: "Test",
|
|
204
|
+
updatedAt: new Date(),
|
|
205
|
+
};
|
|
206
|
+
expect(selectBetterAuthUser(createMockState({ user }))?.email).toBe("test@example.com");
|
|
207
|
+
expect(selectBetterAuthUser(createMockState({ user: null }))).toBeNull();
|
|
208
|
+
});
|
|
209
|
+
it("selectBetterAuthIsLoading returns correct value", () => {
|
|
210
|
+
expect(selectBetterAuthIsLoading(createMockState({ isLoading: true }))).toBe(true);
|
|
211
|
+
expect(selectBetterAuthIsLoading(createMockState({ isLoading: false }))).toBe(false);
|
|
212
|
+
});
|
|
213
|
+
it("selectBetterAuthError returns correct value", () => {
|
|
214
|
+
expect(selectBetterAuthError(createMockState({ error: "Error message" }))).toBe("Error message");
|
|
215
|
+
expect(selectBetterAuthError(createMockState({ error: null }))).toBeNull();
|
|
216
|
+
});
|
|
217
|
+
it("selectors handle missing betterAuth state gracefully", () => {
|
|
218
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test empty state for selector edge case
|
|
219
|
+
const emptyState = {};
|
|
220
|
+
expect(selectBetterAuthIsAuthenticated(emptyState)).toBe(false);
|
|
221
|
+
expect(selectBetterAuthUserId(emptyState)).toBeNull();
|
|
222
|
+
expect(selectBetterAuthUser(emptyState)).toBeNull();
|
|
223
|
+
expect(selectBetterAuthIsLoading(emptyState)).toBe(false);
|
|
224
|
+
expect(selectBetterAuthError(emptyState)).toBeNull();
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
describe("BetterAuthUser interface", () => {
|
|
228
|
+
it("defines user data structure correctly", () => {
|
|
229
|
+
const user = {
|
|
230
|
+
createdAt: new Date("2024-01-01"),
|
|
231
|
+
email: "test@example.com",
|
|
232
|
+
emailVerified: true,
|
|
233
|
+
id: "user-123",
|
|
234
|
+
image: "https://example.com/avatar.jpg",
|
|
235
|
+
name: "Test User",
|
|
236
|
+
updatedAt: new Date("2024-01-02"),
|
|
237
|
+
};
|
|
238
|
+
expect(user.id).toBe("user-123");
|
|
239
|
+
expect(user.email).toBe("test@example.com");
|
|
240
|
+
expect(user.name).toBe("Test User");
|
|
241
|
+
expect(user.image).toBe("https://example.com/avatar.jpg");
|
|
242
|
+
expect(user.emailVerified).toBe(true);
|
|
243
|
+
});
|
|
244
|
+
it("allows null values for optional fields", () => {
|
|
245
|
+
const user = {
|
|
246
|
+
createdAt: new Date(),
|
|
247
|
+
email: "test@example.com",
|
|
248
|
+
emailVerified: false,
|
|
249
|
+
id: "user-123",
|
|
250
|
+
image: null,
|
|
251
|
+
name: null,
|
|
252
|
+
updatedAt: new Date(),
|
|
253
|
+
};
|
|
254
|
+
expect(user.name).toBeNull();
|
|
255
|
+
expect(user.image).toBeNull();
|
|
256
|
+
});
|
|
257
|
+
});
|
|
258
|
+
//# sourceMappingURL=betterAuthSlice.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"betterAuthSlice.test.js","sourceRoot":"","sources":["../src/betterAuthSlice.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Better Auth types for use in Redux slices and components.
|
|
3
|
+
*
|
|
4
|
+
* This file contains only type definitions to avoid importing React Native
|
|
5
|
+
* dependencies in environments that don't support them (e.g., tests).
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* Configuration options for the Better Auth client.
|
|
9
|
+
*/
|
|
10
|
+
export interface BetterAuthClientConfig {
|
|
11
|
+
/**
|
|
12
|
+
* Base URL of the auth server (e.g., "http://localhost:3000").
|
|
13
|
+
*/
|
|
14
|
+
baseURL: string;
|
|
15
|
+
/**
|
|
16
|
+
* App URL scheme for deep linking (e.g., "terreno").
|
|
17
|
+
*/
|
|
18
|
+
scheme: string;
|
|
19
|
+
/**
|
|
20
|
+
* Storage key prefix for auth tokens.
|
|
21
|
+
* @default "terreno"
|
|
22
|
+
*/
|
|
23
|
+
storagePrefix?: string;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* User data from Better Auth session.
|
|
27
|
+
*/
|
|
28
|
+
export interface BetterAuthUser {
|
|
29
|
+
id: string;
|
|
30
|
+
email: string;
|
|
31
|
+
name: string | null;
|
|
32
|
+
image: string | null;
|
|
33
|
+
emailVerified: boolean;
|
|
34
|
+
createdAt: Date;
|
|
35
|
+
updatedAt: Date;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Session data from Better Auth.
|
|
39
|
+
*/
|
|
40
|
+
export interface BetterAuthSession {
|
|
41
|
+
id: string;
|
|
42
|
+
userId: string;
|
|
43
|
+
expiresAt: Date;
|
|
44
|
+
ipAddress: string | null;
|
|
45
|
+
userAgent: string | null;
|
|
46
|
+
createdAt: Date;
|
|
47
|
+
updatedAt: Date;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Combined session and user data from Better Auth.
|
|
51
|
+
*/
|
|
52
|
+
export interface BetterAuthSessionData {
|
|
53
|
+
session: BetterAuthSession;
|
|
54
|
+
user: BetterAuthUser;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* OAuth provider types supported by Better Auth.
|
|
58
|
+
*/
|
|
59
|
+
export type BetterAuthOAuthProvider = "google" | "github" | "apple";
|
|
60
|
+
/**
|
|
61
|
+
* Minimal interface for the Better Auth client used by the Redux slice.
|
|
62
|
+
* This interface defines only the methods needed by the slice, allowing
|
|
63
|
+
* tests to use mock clients without importing React Native.
|
|
64
|
+
*/
|
|
65
|
+
export interface BetterAuthClientInterface {
|
|
66
|
+
getSession: () => Promise<{
|
|
67
|
+
data?: {
|
|
68
|
+
user?: BetterAuthUser;
|
|
69
|
+
session?: BetterAuthSession;
|
|
70
|
+
};
|
|
71
|
+
}>;
|
|
72
|
+
signOut: () => Promise<void>;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=betterAuthTypes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"betterAuthTypes.d.ts","sourceRoot":"","sources":["../src/betterAuthTypes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC;IAEhB;;OAEG;IACH,MAAM,EAAE,MAAM,CAAC;IAEf;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,aAAa,EAAE,OAAO,CAAC;IACvB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,iBAAiB,CAAC;IAC3B,IAAI,EAAE,cAAc,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,QAAQ,GAAG,QAAQ,GAAG,OAAO,CAAC;AAEpE;;;;GAIG;AACH,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,OAAO,CAAC;QACxB,IAAI,CAAC,EAAE;YACL,IAAI,CAAC,EAAE,cAAc,CAAC;YACtB,OAAO,CAAC,EAAE,iBAAiB,CAAC;SAC7B,CAAC;KACH,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Better Auth types for use in Redux slices and components.
|
|
3
|
+
*
|
|
4
|
+
* This file contains only type definitions to avoid importing React Native
|
|
5
|
+
* dependencies in environments that don't support them (e.g., tests).
|
|
6
|
+
*/
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=betterAuthTypes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"betterAuthTypes.js","sourceRoot":"","sources":["../src/betterAuthTypes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,oBAAoB,CAAC;AACnC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,gBAAgB,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"dependencies": {
|
|
3
|
+
"@better-auth/expo": "^1.2.8",
|
|
3
4
|
"@react-native-async-storage/async-storage": "2.2.0",
|
|
4
5
|
"@reduxjs/toolkit": "^2.11.1",
|
|
5
|
-
"@terreno/ui": "0.
|
|
6
|
+
"@terreno/ui": "0.3.0",
|
|
6
7
|
"async-mutex": "^0.5.0",
|
|
7
8
|
"axios": "^1.13.2",
|
|
8
9
|
"axios-retry": "^4.5.0",
|
|
10
|
+
"better-auth": "^1.2.8",
|
|
9
11
|
"expo-constants": "~18.0.12",
|
|
12
|
+
"expo-network": "~8.0.3",
|
|
10
13
|
"expo-secure-store": "^15.0.8",
|
|
11
14
|
"jwt-decode": "^4.0.0",
|
|
12
15
|
"luxon": "^3.7.2",
|
|
@@ -19,6 +22,7 @@
|
|
|
19
22
|
"description": "Redux Toolkit Query utilities for @terreno/api backends",
|
|
20
23
|
"devDependencies": {
|
|
21
24
|
"@biomejs/biome": "^2.3.6",
|
|
25
|
+
"@types/bun": "^1.2.4",
|
|
22
26
|
"@types/luxon": "^3.7.1",
|
|
23
27
|
"@types/node": "^25.0.3",
|
|
24
28
|
"@types/qs": "^6.14.0",
|
|
@@ -46,5 +50,5 @@
|
|
|
46
50
|
"test:ci": "echo 'No tests'"
|
|
47
51
|
},
|
|
48
52
|
"types": "dist/index.d.ts",
|
|
49
|
-
"version": "0.
|
|
53
|
+
"version": "0.3.0"
|
|
50
54
|
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Better Auth client factory for React Native/Expo applications.
|
|
3
|
+
*
|
|
4
|
+
* Provides a configured Better Auth client with Expo-specific storage
|
|
5
|
+
* and deep linking support.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import {expoClient} from "@better-auth/expo/client";
|
|
9
|
+
import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
10
|
+
import {createAuthClient} from "better-auth/react";
|
|
11
|
+
import * as SecureStore from "expo-secure-store";
|
|
12
|
+
import type {BetterAuthClientConfig} from "./betterAuthTypes";
|
|
13
|
+
import {IsWeb} from "./platform";
|
|
14
|
+
|
|
15
|
+
// Re-export types for convenience
|
|
16
|
+
export type {
|
|
17
|
+
BetterAuthClientConfig,
|
|
18
|
+
BetterAuthOAuthProvider,
|
|
19
|
+
BetterAuthSession,
|
|
20
|
+
BetterAuthSessionData,
|
|
21
|
+
BetterAuthUser,
|
|
22
|
+
} from "./betterAuthTypes";
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Storage adapter interface matching what Better Auth expects.
|
|
26
|
+
*/
|
|
27
|
+
interface StorageAdapter {
|
|
28
|
+
setItem: (key: string, value: string) => void | Promise<void>;
|
|
29
|
+
getItem: (key: string) => string | null | Promise<string | null>;
|
|
30
|
+
removeItem?: (key: string) => void | Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Async storage adapter for Better Auth that works on both web and native.
|
|
35
|
+
* Uses SecureStore on native platforms and AsyncStorage on web.
|
|
36
|
+
*/
|
|
37
|
+
const createStorageAdapter = (): StorageAdapter => {
|
|
38
|
+
if (IsWeb) {
|
|
39
|
+
return {
|
|
40
|
+
getItem: (key: string): Promise<string | null> => {
|
|
41
|
+
if (typeof window !== "undefined") {
|
|
42
|
+
return AsyncStorage.getItem(key);
|
|
43
|
+
}
|
|
44
|
+
return Promise.resolve(null);
|
|
45
|
+
},
|
|
46
|
+
removeItem: (key: string): Promise<void> => {
|
|
47
|
+
if (typeof window !== "undefined") {
|
|
48
|
+
return AsyncStorage.removeItem(key);
|
|
49
|
+
}
|
|
50
|
+
return Promise.resolve();
|
|
51
|
+
},
|
|
52
|
+
setItem: (key: string, value: string): Promise<void> => {
|
|
53
|
+
if (typeof window !== "undefined") {
|
|
54
|
+
return AsyncStorage.setItem(key, value);
|
|
55
|
+
}
|
|
56
|
+
return Promise.resolve();
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Native platform - use SecureStore
|
|
62
|
+
return {
|
|
63
|
+
getItem: (key: string) => SecureStore.getItemAsync(key),
|
|
64
|
+
removeItem: (key: string) => SecureStore.deleteItemAsync(key),
|
|
65
|
+
setItem: (key: string, value: string) => SecureStore.setItemAsync(key, value),
|
|
66
|
+
};
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Creates a Better Auth client configured for Expo/React Native.
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* ```typescript
|
|
74
|
+
* const authClient = createBetterAuthClient({
|
|
75
|
+
* baseURL: "http://localhost:3000",
|
|
76
|
+
* scheme: "terreno",
|
|
77
|
+
* });
|
|
78
|
+
*
|
|
79
|
+
* // Use for social login
|
|
80
|
+
* await authClient.signIn.social({
|
|
81
|
+
* provider: "google",
|
|
82
|
+
* });
|
|
83
|
+
*
|
|
84
|
+
* // Get current session
|
|
85
|
+
* const session = await authClient.getSession();
|
|
86
|
+
* ```
|
|
87
|
+
*/
|
|
88
|
+
export const createBetterAuthClient = (config: BetterAuthClientConfig) => {
|
|
89
|
+
const storage = createStorageAdapter();
|
|
90
|
+
|
|
91
|
+
return createAuthClient({
|
|
92
|
+
baseURL: config.baseURL,
|
|
93
|
+
plugins: [
|
|
94
|
+
expoClient({
|
|
95
|
+
scheme: config.scheme,
|
|
96
|
+
// biome-ignore lint/suspicious/noExplicitAny: Better Auth storage type is flexible
|
|
97
|
+
storage: storage as any,
|
|
98
|
+
storagePrefix: config.storagePrefix ?? "terreno",
|
|
99
|
+
}),
|
|
100
|
+
],
|
|
101
|
+
});
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Type of the Better Auth client returned by createBetterAuthClient.
|
|
106
|
+
*/
|
|
107
|
+
export type BetterAuthClient = ReturnType<typeof createBetterAuthClient>;
|