@terreno/rtk 0.9.0 → 0.9.2
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/authSlice.d.ts +13 -2
- package/dist/authSlice.d.ts.map +1 -1
- package/dist/authSlice.js +43 -5
- package/dist/authSlice.js.map +1 -1
- package/dist/authSlice.test.d.ts +2 -0
- package/dist/authSlice.test.d.ts.map +1 -0
- package/dist/authSlice.test.js +269 -0
- package/dist/authSlice.test.js.map +1 -0
- package/dist/test-preload.d.ts +2 -0
- package/dist/test-preload.d.ts.map +1 -0
- package/dist/test-preload.js +24 -0
- package/dist/test-preload.js.map +1 -0
- package/dist/useUpgradeCheck.d.ts +30 -1
- package/dist/useUpgradeCheck.d.ts.map +1 -1
- package/dist/useUpgradeCheck.js +67 -15
- package/dist/useUpgradeCheck.js.map +1 -1
- package/package.json +4 -3
- package/src/authSlice.test.ts +306 -0
- package/src/authSlice.ts +51 -9
- package/src/test-preload.ts +28 -0
- package/src/useUpgradeCheck.ts +91 -17
package/dist/authSlice.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ import { type RootState } from "./constants";
|
|
|
4
4
|
type AuthState = {
|
|
5
5
|
userId: string | null;
|
|
6
6
|
error: string | null;
|
|
7
|
+
isAuthenticating: boolean;
|
|
7
8
|
lastTokenRefreshTimestamp: number | null;
|
|
8
9
|
};
|
|
9
10
|
export interface UserResponse {
|
|
@@ -13,10 +14,15 @@ export interface UserResponse {
|
|
|
13
14
|
refreshToken: string;
|
|
14
15
|
};
|
|
15
16
|
}
|
|
16
|
-
export
|
|
17
|
+
export type EmailLoginRequest = {
|
|
17
18
|
email: string;
|
|
19
|
+
username?: never;
|
|
18
20
|
password: string;
|
|
19
|
-
}
|
|
21
|
+
} | {
|
|
22
|
+
username: string;
|
|
23
|
+
email?: never;
|
|
24
|
+
password: string;
|
|
25
|
+
};
|
|
20
26
|
export interface EmailSignupRequest {
|
|
21
27
|
email: string;
|
|
22
28
|
password: string;
|
|
@@ -43,11 +49,13 @@ export declare const generateAuthSlice: (api: Api<any, any, any, any, any>) => {
|
|
|
43
49
|
logout: (state: {
|
|
44
50
|
userId: string | null;
|
|
45
51
|
error: string | null;
|
|
52
|
+
isAuthenticating: boolean;
|
|
46
53
|
lastTokenRefreshTimestamp: number | null;
|
|
47
54
|
}) => void;
|
|
48
55
|
setUserId: (state: {
|
|
49
56
|
userId: string | null;
|
|
50
57
|
error: string | null;
|
|
58
|
+
isAuthenticating: boolean;
|
|
51
59
|
lastTokenRefreshTimestamp: number | null;
|
|
52
60
|
}, { payload: { userId } }: PayloadAction<{
|
|
53
61
|
userId: string;
|
|
@@ -55,6 +63,7 @@ export declare const generateAuthSlice: (api: Api<any, any, any, any, any>) => {
|
|
|
55
63
|
tokenRefreshedSuccess: (state: {
|
|
56
64
|
userId: string | null;
|
|
57
65
|
error: string | null;
|
|
66
|
+
isAuthenticating: boolean;
|
|
58
67
|
lastTokenRefreshTimestamp: number | null;
|
|
59
68
|
}) => void;
|
|
60
69
|
}, "auth", "auth", import("@reduxjs/toolkit").SliceSelectors<AuthState>>;
|
|
@@ -67,7 +76,9 @@ export declare const generateAuthSlice: (api: Api<any, any, any, any, any>) => {
|
|
|
67
76
|
};
|
|
68
77
|
export declare const selectCurrentUserId: (state: RootState) => string | undefined;
|
|
69
78
|
export declare const selectLastTokenRefreshTimestamp: (state: RootState) => number | null;
|
|
79
|
+
export declare const selectIsAuthenticating: (state: RootState) => boolean;
|
|
70
80
|
export declare const useSelectCurrentUserId: () => string | undefined;
|
|
81
|
+
export declare const useSelectIsAuthenticating: () => boolean;
|
|
71
82
|
export declare function getAuthToken(): Promise<string | null>;
|
|
72
83
|
export {};
|
|
73
84
|
//# sourceMappingURL=authSlice.d.ts.map
|
package/dist/authSlice.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authSlice.d.ts","sourceRoot":"","sources":["../src/authSlice.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwC,KAAK,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAAC,GAAG,EAAE,WAAW,EAAE,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAIpF,OAAO,EAAqB,KAAK,SAAS,EAAC,MAAM,aAAa,CAAC;AAG/D,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,
|
|
1
|
+
{"version":3,"file":"authSlice.d.ts","sourceRoot":"","sources":["../src/authSlice.ts"],"names":[],"mappings":"AAGA,OAAO,EAAwC,KAAK,aAAa,EAAC,MAAM,kBAAkB,CAAC;AAC3F,OAAO,KAAK,EAAC,GAAG,EAAE,WAAW,EAAE,eAAe,EAAC,MAAM,8BAA8B,CAAC;AAIpF,OAAO,EAAqB,KAAK,SAAS,EAAC,MAAM,aAAa,CAAC;AAG/D,KAAK,SAAS,GAAG;IACf,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE;QACJ,MAAM,EAAE,MAAM,CAAC;QACf,KAAK,EAAE,MAAM,CAAC;QACd,YAAY,EAAE,MAAM,CAAC;KACtB,CAAC;CACH;AAED,MAAM,MAAM,iBAAiB,GACzB;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,GACnD;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAC,CAAC;AAExD,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAEjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAEjB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,wBAAgB,wBAAwB,CAEtC,OAAO,EAAE,eAAe,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,EAC7E,IAAI,EAAE,MAAM;;;;;;EAiDb;AAGD,eAAO,MAAM,iBAAiB,GAAI,KAAK,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;;;;oBA5FzD,MAAM,GAAG,IAAI;mBACd,MAAM,GAAG,IAAI;8BACF,OAAO;uCACE,MAAM,GAAG,IAAI;;;oBAHhC,MAAM,GAAG,IAAI;mBACd,MAAM,GAAG,IAAI;8BACF,OAAO;uCACE,MAAM,GAAG,IAAI;oCAqKI,aAAa,CAAC;YAAC,MAAM,EAAE,MAAM,CAAA;SAAC,CAAC;;oBAxKnE,MAAM,GAAG,IAAI;mBACd,MAAM,GAAG,IAAI;8BACF,OAAO;uCACE,MAAM,GAAG,IAAI;;;;;;gBAqK2B,MAAM;;;CAsG1E,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO,SAAS,KAAG,MAAM,GAAG,SAA+B,CAAC;AAChG,eAAO,MAAM,+BAA+B,GAAI,OAAO,SAAS,KAAG,MAAM,GAAG,IACrC,CAAC;AACxC,eAAO,MAAM,sBAAsB,GAAI,OAAO,SAAS,KAAG,OACnB,CAAC;AAExC,eAAO,MAAM,sBAAsB,QAAO,MAAM,GAAG,SAIlD,CAAC;AAEF,eAAO,MAAM,yBAAyB,QAAO,OAE5C,CAAC;AAEF,wBAAsB,YAAY,IAAI,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAe3D"}
|
package/dist/authSlice.js
CHANGED
|
@@ -25,8 +25,8 @@ builder, path) {
|
|
|
25
25
|
emailLogin: builder.mutation({
|
|
26
26
|
extraOptions: { maxRetries: 0 },
|
|
27
27
|
invalidatesTags: [path],
|
|
28
|
-
query: ({ email, password }) => ({
|
|
29
|
-
body: { email, password },
|
|
28
|
+
query: ({ email, username, password }) => ({
|
|
29
|
+
body: { email, password, username },
|
|
30
30
|
method: "POST",
|
|
31
31
|
url: "auth/login",
|
|
32
32
|
}),
|
|
@@ -62,42 +62,76 @@ builder, path) {
|
|
|
62
62
|
export const generateAuthSlice = (api) => {
|
|
63
63
|
const authSlice = createSlice({
|
|
64
64
|
extraReducers: (builder) => {
|
|
65
|
-
|
|
65
|
+
// Reset isAuthenticating on rehydration in case the app was killed mid-login
|
|
66
|
+
builder.addCase("persist/REHYDRATE", (state) => {
|
|
67
|
+
state.isAuthenticating = false;
|
|
68
|
+
});
|
|
69
|
+
builder.addMatcher(api.endpoints.emailLogin.matchFulfilled, (state) => {
|
|
70
|
+
// Note: isAuthenticating is normally cleared by setUserId after the listener
|
|
71
|
+
// middleware stores the token. This is a safety fallback in case the listener fails.
|
|
72
|
+
state.isAuthenticating = false;
|
|
66
73
|
console.debug("Login success");
|
|
67
74
|
});
|
|
68
75
|
builder.addMatcher(api.endpoints.emailLogin.matchRejected,
|
|
69
76
|
// biome-ignore lint/suspicious/noExplicitAny: Generic
|
|
70
77
|
(state, action) => {
|
|
71
78
|
state.error = action.payload?.data?.message;
|
|
79
|
+
state.isAuthenticating = false;
|
|
72
80
|
console.debug("Login rejected", action.payload?.data?.message);
|
|
73
81
|
});
|
|
74
82
|
builder.addMatcher(api.endpoints.emailLogin.matchPending, (state) => {
|
|
75
83
|
state.error = null;
|
|
84
|
+
state.isAuthenticating = true;
|
|
76
85
|
console.debug("Login pending");
|
|
77
86
|
});
|
|
78
|
-
builder.addMatcher(api.endpoints.emailSignUp.matchFulfilled, () => {
|
|
87
|
+
builder.addMatcher(api.endpoints.emailSignUp.matchFulfilled, (state) => {
|
|
88
|
+
// Safety fallback: clear isAuthenticating in case the listener middleware fails.
|
|
89
|
+
state.isAuthenticating = false;
|
|
79
90
|
console.debug("Signup success");
|
|
80
91
|
});
|
|
81
92
|
builder.addMatcher(api.endpoints.emailSignUp.matchRejected,
|
|
82
93
|
// biome-ignore lint/suspicious/noExplicitAny: Generic
|
|
83
94
|
(state, action) => {
|
|
84
95
|
state.error = action.payload?.data?.message;
|
|
96
|
+
state.isAuthenticating = false;
|
|
85
97
|
console.debug("Signup rejected", action.payload);
|
|
86
98
|
});
|
|
87
99
|
builder.addMatcher(api.endpoints.emailSignUp.matchPending, (state) => {
|
|
88
100
|
state.error = null;
|
|
101
|
+
state.isAuthenticating = true;
|
|
89
102
|
console.debug("Signup pending");
|
|
90
103
|
});
|
|
104
|
+
builder.addMatcher(api.endpoints.googleLogin.matchPending, (state) => {
|
|
105
|
+
state.error = null;
|
|
106
|
+
state.isAuthenticating = true;
|
|
107
|
+
});
|
|
108
|
+
builder.addMatcher(api.endpoints.googleLogin.matchFulfilled, (state) => {
|
|
109
|
+
// Safety fallback: clear isAuthenticating in case the listener middleware fails.
|
|
110
|
+
state.isAuthenticating = false;
|
|
111
|
+
});
|
|
112
|
+
builder.addMatcher(api.endpoints.googleLogin.matchRejected,
|
|
113
|
+
// biome-ignore lint/suspicious/noExplicitAny: Generic
|
|
114
|
+
(state, action) => {
|
|
115
|
+
state.error = action.payload?.data?.message;
|
|
116
|
+
state.isAuthenticating = false;
|
|
117
|
+
});
|
|
118
|
+
},
|
|
119
|
+
initialState: {
|
|
120
|
+
error: null,
|
|
121
|
+
isAuthenticating: false,
|
|
122
|
+
lastTokenRefreshTimestamp: null,
|
|
123
|
+
userId: null,
|
|
91
124
|
},
|
|
92
|
-
initialState: { error: null, lastTokenRefreshTimestamp: null, userId: null },
|
|
93
125
|
name: "auth",
|
|
94
126
|
reducers: {
|
|
95
127
|
logout: (state) => {
|
|
96
128
|
state.userId = null;
|
|
129
|
+
state.isAuthenticating = false;
|
|
97
130
|
state.lastTokenRefreshTimestamp = null;
|
|
98
131
|
},
|
|
99
132
|
setUserId: (state, { payload: { userId } }) => {
|
|
100
133
|
state.userId = userId;
|
|
134
|
+
state.isAuthenticating = false;
|
|
101
135
|
},
|
|
102
136
|
tokenRefreshedSuccess: (state) => {
|
|
103
137
|
state.lastTokenRefreshTimestamp = Date.now();
|
|
@@ -202,11 +236,15 @@ export const generateAuthSlice = (api) => {
|
|
|
202
236
|
};
|
|
203
237
|
export const selectCurrentUserId = (state) => state.auth?.userId;
|
|
204
238
|
export const selectLastTokenRefreshTimestamp = (state) => state.auth?.lastTokenRefreshTimestamp;
|
|
239
|
+
export const selectIsAuthenticating = (state) => state.auth?.isAuthenticating ?? false;
|
|
205
240
|
export const useSelectCurrentUserId = () => {
|
|
206
241
|
return useSelector((state) => {
|
|
207
242
|
return state.auth?.userId;
|
|
208
243
|
});
|
|
209
244
|
};
|
|
245
|
+
export const useSelectIsAuthenticating = () => {
|
|
246
|
+
return useSelector((state) => state.auth?.isAuthenticating ?? false);
|
|
247
|
+
};
|
|
210
248
|
export async function getAuthToken() {
|
|
211
249
|
let token;
|
|
212
250
|
if (!IsWeb) {
|
package/dist/authSlice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authSlice.js","sourceRoot":"","sources":["../src/authSlice.ts"],"names":[],"mappings":"AAAA,kGAAkG;AAClG,SAAS;AACT,OAAO,YAAY,MAAM,2CAA2C,CAAC;AACrE,OAAO,EAAC,wBAAwB,EAAE,WAAW,EAAqB,MAAM,kBAAkB,CAAC;AAE3F,OAAO,KAAK,WAAW,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAC,WAAW,EAAC,MAAM,aAAa,CAAC;AAExC,OAAO,EAAC,kBAAkB,EAAiB,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAC,KAAK,EAAC,MAAM,YAAY,CAAC;AAuCjC,2DAA2D;AAC3D,MAAM,UAAU,wBAAwB;AACtC,sDAAsD;AACtD,OAA6E,EAC7E,IAAY;IAEZ,OAAO;QACL,0FAA0F;QAC1F,8FAA8F;QAC9F,uDAAuD;QACvD,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAmC;YAClE,eAAe,EAAE,CAAC,IAAI,EAAE,eAAe,CAAC;YACxC,KAAK,EAAE,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAC,EAAE,EAAE,CAAC,CAAC;gBACtC,IAAI,EAAE,EAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,IAAI,EAAC;gBAChC,MAAM,EAAE,MAAM;gBACd,GAAG,EAAE,aAAa;aACnB,CAAC;SACH,CAAC;QACF,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAkC;YAC5D,YAAY,EAAE,EAAC,UAAU,EAAE,CAAC,EAAC;YAC7B,eAAe,EAAE,CAAC,IAAI,CAAC;YACvB,KAAK,EAAE,CAAC,EAAC,KAAK,EAAE,QAAQ,EAAC,EAAE,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"authSlice.js","sourceRoot":"","sources":["../src/authSlice.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authSlice.test.d.ts","sourceRoot":"","sources":["../src/authSlice.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,269 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, it } from "bun:test";
|
|
2
|
+
import { configureStore } from "@reduxjs/toolkit";
|
|
3
|
+
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react";
|
|
4
|
+
import { generateAuthSlice, selectCurrentUserId, selectIsAuthenticating, } from "./authSlice";
|
|
5
|
+
// Create a real RTK Query API with the endpoints that generateAuthSlice expects
|
|
6
|
+
const api = createApi({
|
|
7
|
+
baseQuery: fetchBaseQuery({ baseUrl: "/" }),
|
|
8
|
+
endpoints: (builder) => ({
|
|
9
|
+
emailLogin: builder.mutation({
|
|
10
|
+
query: (body) => ({ body, method: "POST", url: "auth/login" }),
|
|
11
|
+
}),
|
|
12
|
+
emailSignUp: builder.mutation({
|
|
13
|
+
query: (body) => ({
|
|
14
|
+
body,
|
|
15
|
+
method: "POST",
|
|
16
|
+
url: "auth/signup",
|
|
17
|
+
}),
|
|
18
|
+
}),
|
|
19
|
+
googleLogin: builder.mutation({
|
|
20
|
+
query: (body) => ({ body, method: "POST", url: "auth/google" }),
|
|
21
|
+
}),
|
|
22
|
+
}),
|
|
23
|
+
reducerPath: "terreno-rtk",
|
|
24
|
+
});
|
|
25
|
+
const createTestStore = () => {
|
|
26
|
+
const { authReducer, middleware, ...rest } = generateAuthSlice(
|
|
27
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test mock
|
|
28
|
+
api);
|
|
29
|
+
return {
|
|
30
|
+
...rest,
|
|
31
|
+
store: configureStore({
|
|
32
|
+
middleware: (getDefault) => getDefault({ serializableCheck: false }).concat(api.middleware, ...middleware),
|
|
33
|
+
reducer: {
|
|
34
|
+
[api.reducerPath]: api.reducer,
|
|
35
|
+
auth: authReducer,
|
|
36
|
+
},
|
|
37
|
+
}),
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
describe("generateAuthSlice", () => {
|
|
41
|
+
let store;
|
|
42
|
+
let authSlice;
|
|
43
|
+
beforeEach(() => {
|
|
44
|
+
const result = createTestStore();
|
|
45
|
+
store = result.store;
|
|
46
|
+
authSlice = result.authSlice;
|
|
47
|
+
});
|
|
48
|
+
describe("initial state", () => {
|
|
49
|
+
it("has correct initial values", () => {
|
|
50
|
+
const state = store.getState().auth;
|
|
51
|
+
expect(state.userId).toBeNull();
|
|
52
|
+
expect(state.error).toBeNull();
|
|
53
|
+
expect(state.isAuthenticating).toBe(false);
|
|
54
|
+
expect(state.lastTokenRefreshTimestamp).toBeNull();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
describe("reducers", () => {
|
|
58
|
+
it("setUserId sets userId and clears isAuthenticating", () => {
|
|
59
|
+
store.dispatch(authSlice.actions.setUserId({ userId: "user-123" }));
|
|
60
|
+
const state = store.getState().auth;
|
|
61
|
+
expect(state.userId).toBe("user-123");
|
|
62
|
+
expect(state.isAuthenticating).toBe(false);
|
|
63
|
+
});
|
|
64
|
+
it("logout clears state", () => {
|
|
65
|
+
store.dispatch(authSlice.actions.setUserId({ userId: "user-123" }));
|
|
66
|
+
store.dispatch(authSlice.actions.logout());
|
|
67
|
+
const state = store.getState().auth;
|
|
68
|
+
expect(state.userId).toBeNull();
|
|
69
|
+
expect(state.isAuthenticating).toBe(false);
|
|
70
|
+
expect(state.lastTokenRefreshTimestamp).toBeNull();
|
|
71
|
+
});
|
|
72
|
+
it("tokenRefreshedSuccess sets timestamp", () => {
|
|
73
|
+
const before = Date.now();
|
|
74
|
+
store.dispatch(authSlice.actions.tokenRefreshedSuccess());
|
|
75
|
+
const state = store.getState().auth;
|
|
76
|
+
expect(state.lastTokenRefreshTimestamp).toBeGreaterThanOrEqual(before);
|
|
77
|
+
expect(state.lastTokenRefreshTimestamp).toBeLessThanOrEqual(Date.now());
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
describe("emailLogin matchers", () => {
|
|
81
|
+
it("matchPending sets isAuthenticating and clears error", () => {
|
|
82
|
+
// Simulate a pending email login action
|
|
83
|
+
store.dispatch({
|
|
84
|
+
meta: { arg: { endpointName: "emailLogin", type: "mutation" }, requestId: "test-1" },
|
|
85
|
+
payload: undefined,
|
|
86
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
87
|
+
});
|
|
88
|
+
const state = store.getState().auth;
|
|
89
|
+
expect(state.isAuthenticating).toBe(true);
|
|
90
|
+
expect(state.error).toBeNull();
|
|
91
|
+
});
|
|
92
|
+
it("matchFulfilled clears isAuthenticating", () => {
|
|
93
|
+
// Set authenticating first
|
|
94
|
+
store.dispatch({
|
|
95
|
+
meta: { arg: { endpointName: "emailLogin", type: "mutation" }, requestId: "test-1" },
|
|
96
|
+
payload: undefined,
|
|
97
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
98
|
+
});
|
|
99
|
+
expect(store.getState().auth.isAuthenticating).toBe(true);
|
|
100
|
+
// Then fulfill
|
|
101
|
+
store.dispatch({
|
|
102
|
+
meta: { arg: { endpointName: "emailLogin", type: "mutation" }, requestId: "test-1" },
|
|
103
|
+
payload: { token: "abc", userId: "user-1" },
|
|
104
|
+
type: "terreno-rtk/executeMutation/fulfilled",
|
|
105
|
+
});
|
|
106
|
+
expect(store.getState().auth.isAuthenticating).toBe(false);
|
|
107
|
+
});
|
|
108
|
+
it("matchRejected sets error and clears isAuthenticating", () => {
|
|
109
|
+
// Set authenticating first
|
|
110
|
+
store.dispatch({
|
|
111
|
+
meta: { arg: { endpointName: "emailLogin", type: "mutation" }, requestId: "test-1" },
|
|
112
|
+
payload: undefined,
|
|
113
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
114
|
+
});
|
|
115
|
+
// Then reject with error
|
|
116
|
+
store.dispatch({
|
|
117
|
+
meta: { arg: { endpointName: "emailLogin", type: "mutation" }, requestId: "test-1" },
|
|
118
|
+
payload: { data: { message: "Invalid credentials" } },
|
|
119
|
+
type: "terreno-rtk/executeMutation/rejected",
|
|
120
|
+
});
|
|
121
|
+
const state = store.getState().auth;
|
|
122
|
+
expect(state.isAuthenticating).toBe(false);
|
|
123
|
+
expect(state.error).toBe("Invalid credentials");
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe("emailSignUp matchers", () => {
|
|
127
|
+
it("matchPending sets isAuthenticating and clears error", () => {
|
|
128
|
+
store.dispatch({
|
|
129
|
+
meta: { arg: { endpointName: "emailSignUp", type: "mutation" }, requestId: "test-1" },
|
|
130
|
+
payload: undefined,
|
|
131
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
132
|
+
});
|
|
133
|
+
const state = store.getState().auth;
|
|
134
|
+
expect(state.isAuthenticating).toBe(true);
|
|
135
|
+
expect(state.error).toBeNull();
|
|
136
|
+
});
|
|
137
|
+
it("matchFulfilled clears isAuthenticating", () => {
|
|
138
|
+
store.dispatch({
|
|
139
|
+
meta: { arg: { endpointName: "emailSignUp", type: "mutation" }, requestId: "test-1" },
|
|
140
|
+
payload: undefined,
|
|
141
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
142
|
+
});
|
|
143
|
+
store.dispatch({
|
|
144
|
+
meta: { arg: { endpointName: "emailSignUp", type: "mutation" }, requestId: "test-1" },
|
|
145
|
+
payload: { token: "abc", userId: "user-1" },
|
|
146
|
+
type: "terreno-rtk/executeMutation/fulfilled",
|
|
147
|
+
});
|
|
148
|
+
expect(store.getState().auth.isAuthenticating).toBe(false);
|
|
149
|
+
});
|
|
150
|
+
it("matchRejected sets error and clears isAuthenticating", () => {
|
|
151
|
+
store.dispatch({
|
|
152
|
+
meta: { arg: { endpointName: "emailSignUp", type: "mutation" }, requestId: "test-1" },
|
|
153
|
+
payload: undefined,
|
|
154
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
155
|
+
});
|
|
156
|
+
store.dispatch({
|
|
157
|
+
meta: { arg: { endpointName: "emailSignUp", type: "mutation" }, requestId: "test-1" },
|
|
158
|
+
payload: { data: { message: "Email already exists" } },
|
|
159
|
+
type: "terreno-rtk/executeMutation/rejected",
|
|
160
|
+
});
|
|
161
|
+
const state = store.getState().auth;
|
|
162
|
+
expect(state.isAuthenticating).toBe(false);
|
|
163
|
+
expect(state.error).toBe("Email already exists");
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
describe("googleLogin matchers", () => {
|
|
167
|
+
it("matchPending sets isAuthenticating and clears error", () => {
|
|
168
|
+
store.dispatch({
|
|
169
|
+
meta: { arg: { endpointName: "googleLogin", type: "mutation" }, requestId: "test-1" },
|
|
170
|
+
payload: undefined,
|
|
171
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
172
|
+
});
|
|
173
|
+
const state = store.getState().auth;
|
|
174
|
+
expect(state.isAuthenticating).toBe(true);
|
|
175
|
+
expect(state.error).toBeNull();
|
|
176
|
+
});
|
|
177
|
+
it("matchPending clears stale error from previous attempt", () => {
|
|
178
|
+
// First: fail a login to set an error
|
|
179
|
+
store.dispatch({
|
|
180
|
+
meta: { arg: { endpointName: "emailLogin", type: "mutation" }, requestId: "test-1" },
|
|
181
|
+
payload: { data: { message: "Previous error" } },
|
|
182
|
+
type: "terreno-rtk/executeMutation/rejected",
|
|
183
|
+
});
|
|
184
|
+
expect(store.getState().auth.error).toBe("Previous error");
|
|
185
|
+
// Then: start a google login — should clear the error
|
|
186
|
+
store.dispatch({
|
|
187
|
+
meta: { arg: { endpointName: "googleLogin", type: "mutation" }, requestId: "test-2" },
|
|
188
|
+
payload: undefined,
|
|
189
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
190
|
+
});
|
|
191
|
+
expect(store.getState().auth.error).toBeNull();
|
|
192
|
+
});
|
|
193
|
+
it("matchFulfilled clears isAuthenticating", () => {
|
|
194
|
+
store.dispatch({
|
|
195
|
+
meta: { arg: { endpointName: "googleLogin", type: "mutation" }, requestId: "test-1" },
|
|
196
|
+
payload: undefined,
|
|
197
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
198
|
+
});
|
|
199
|
+
store.dispatch({
|
|
200
|
+
meta: { arg: { endpointName: "googleLogin", type: "mutation" }, requestId: "test-1" },
|
|
201
|
+
payload: { token: "abc", userId: "user-1" },
|
|
202
|
+
type: "terreno-rtk/executeMutation/fulfilled",
|
|
203
|
+
});
|
|
204
|
+
expect(store.getState().auth.isAuthenticating).toBe(false);
|
|
205
|
+
});
|
|
206
|
+
it("matchRejected sets error and clears isAuthenticating", () => {
|
|
207
|
+
store.dispatch({
|
|
208
|
+
meta: { arg: { endpointName: "googleLogin", type: "mutation" }, requestId: "test-1" },
|
|
209
|
+
payload: undefined,
|
|
210
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
211
|
+
});
|
|
212
|
+
store.dispatch({
|
|
213
|
+
meta: { arg: { endpointName: "googleLogin", type: "mutation" }, requestId: "test-1" },
|
|
214
|
+
payload: { data: { message: "Google auth failed" } },
|
|
215
|
+
type: "terreno-rtk/executeMutation/rejected",
|
|
216
|
+
});
|
|
217
|
+
const state = store.getState().auth;
|
|
218
|
+
expect(state.isAuthenticating).toBe(false);
|
|
219
|
+
expect(state.error).toBe("Google auth failed");
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
describe("persist/REHYDRATE", () => {
|
|
223
|
+
it("resets isAuthenticating to false", () => {
|
|
224
|
+
// Set authenticating
|
|
225
|
+
store.dispatch({
|
|
226
|
+
meta: { arg: { endpointName: "emailLogin", type: "mutation" }, requestId: "test-1" },
|
|
227
|
+
payload: undefined,
|
|
228
|
+
type: "terreno-rtk/executeMutation/pending",
|
|
229
|
+
});
|
|
230
|
+
expect(store.getState().auth.isAuthenticating).toBe(true);
|
|
231
|
+
// Simulate rehydration
|
|
232
|
+
store.dispatch({ type: "persist/REHYDRATE" });
|
|
233
|
+
expect(store.getState().auth.isAuthenticating).toBe(false);
|
|
234
|
+
});
|
|
235
|
+
});
|
|
236
|
+
});
|
|
237
|
+
describe("selectors", () => {
|
|
238
|
+
it("selectCurrentUserId returns userId", () => {
|
|
239
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test mock state
|
|
240
|
+
const state = { auth: { userId: "user-123" } };
|
|
241
|
+
expect(selectCurrentUserId(state)).toBe("user-123");
|
|
242
|
+
});
|
|
243
|
+
it("selectCurrentUserId returns undefined when no auth state", () => {
|
|
244
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test mock state
|
|
245
|
+
expect(selectCurrentUserId({})).toBeUndefined();
|
|
246
|
+
});
|
|
247
|
+
it("selectIsAuthenticating returns isAuthenticating", () => {
|
|
248
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test mock state
|
|
249
|
+
const state = { auth: { isAuthenticating: true } };
|
|
250
|
+
expect(selectIsAuthenticating(state)).toBe(true);
|
|
251
|
+
});
|
|
252
|
+
it("selectIsAuthenticating defaults to false", () => {
|
|
253
|
+
// biome-ignore lint/suspicious/noExplicitAny: Test mock state
|
|
254
|
+
expect(selectIsAuthenticating({})).toBe(false);
|
|
255
|
+
});
|
|
256
|
+
});
|
|
257
|
+
describe("EmailLoginRequest type", () => {
|
|
258
|
+
it("accepts email-based login", () => {
|
|
259
|
+
const request = { email: "test@example.com", password: "pass" };
|
|
260
|
+
expect(request.email).toBe("test@example.com");
|
|
261
|
+
expect(request.password).toBe("pass");
|
|
262
|
+
});
|
|
263
|
+
it("accepts username-based login", () => {
|
|
264
|
+
const request = { password: "pass", username: "testuser" };
|
|
265
|
+
expect(request.username).toBe("testuser");
|
|
266
|
+
expect(request.password).toBe("pass");
|
|
267
|
+
});
|
|
268
|
+
});
|
|
269
|
+
//# sourceMappingURL=authSlice.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"authSlice.test.js","sourceRoot":"","sources":["../src/authSlice.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-preload.d.ts","sourceRoot":"","sources":["../src/test-preload.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { mock } from "bun:test";
|
|
2
|
+
mock.module("react-native", () => ({
|
|
3
|
+
Platform: { OS: "web" },
|
|
4
|
+
StyleSheet: { create: (s) => s },
|
|
5
|
+
}));
|
|
6
|
+
mock.module("expo-secure-store", () => ({
|
|
7
|
+
deleteItemAsync: async () => { },
|
|
8
|
+
getItemAsync: async () => null,
|
|
9
|
+
setItemAsync: async () => { },
|
|
10
|
+
}));
|
|
11
|
+
mock.module("@react-native-async-storage/async-storage", () => ({
|
|
12
|
+
default: {
|
|
13
|
+
getItem: async () => null,
|
|
14
|
+
removeItem: async () => { },
|
|
15
|
+
setItem: async () => { },
|
|
16
|
+
},
|
|
17
|
+
}));
|
|
18
|
+
mock.module("expo-constants", () => ({
|
|
19
|
+
default: { expoConfig: { extra: {} } },
|
|
20
|
+
}));
|
|
21
|
+
mock.module("expo-network", () => ({
|
|
22
|
+
getNetworkStateAsync: async () => ({ isConnected: true }),
|
|
23
|
+
}));
|
|
24
|
+
//# sourceMappingURL=test-preload.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test-preload.js","sourceRoot":"","sources":["../src/test-preload.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,UAAU,CAAC;AAE9B,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,QAAQ,EAAE,EAAC,EAAE,EAAE,KAAK,EAAC;IACrB,UAAU,EAAE,EAAC,MAAM,EAAE,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,EAAC;CACxC,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,MAAM,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,CAAC;IACtC,eAAe,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;IAC/B,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;IAC9B,YAAY,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;CAC7B,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,MAAM,CAAC,2CAA2C,EAAE,GAAG,EAAE,CAAC,CAAC;IAC9D,OAAO,EAAE;QACP,OAAO,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QACzB,UAAU,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QAC1B,OAAO,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;KACxB;CACF,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,MAAM,CAAC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC;IACnC,OAAO,EAAE,EAAC,UAAU,EAAE,EAAC,KAAK,EAAE,EAAE,EAAC,EAAC;CACnC,CAAC,CAAC,CAAC;AAEJ,IAAI,CAAC,MAAM,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,CAAC;IACjC,oBAAoB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAC,WAAW,EAAE,IAAI,EAAC,CAAC;CACxD,CAAC,CAAC,CAAC"}
|
|
@@ -1,9 +1,38 @@
|
|
|
1
|
+
interface UseUpgradeCheckOptions {
|
|
2
|
+
/**
|
|
3
|
+
* How often to re-check for updates (in milliseconds).
|
|
4
|
+
* Defaults to undefined (no polling — single check on mount only).
|
|
5
|
+
*/
|
|
6
|
+
pollingIntervalMs?: number;
|
|
7
|
+
/**
|
|
8
|
+
* Re-check when the app or browser tab returns to the foreground.
|
|
9
|
+
* Defaults to false.
|
|
10
|
+
*/
|
|
11
|
+
recheckOnForeground?: boolean;
|
|
12
|
+
}
|
|
1
13
|
interface UseUpgradeCheckResult {
|
|
2
14
|
canUpdate: boolean;
|
|
3
15
|
isRequired: boolean;
|
|
16
|
+
isWarning: boolean;
|
|
4
17
|
requiredMessage?: string;
|
|
18
|
+
warningMessage?: string;
|
|
5
19
|
onUpdate: () => void;
|
|
6
20
|
}
|
|
7
|
-
|
|
21
|
+
/**
|
|
22
|
+
* Checks the running app build number against the backend's VersionConfig
|
|
23
|
+
* thresholds and returns the current upgrade status.
|
|
24
|
+
*
|
|
25
|
+
* - `isRequired` — the build is below the required threshold; the caller
|
|
26
|
+
* should block the UI (e.g. with `UpgradeRequiredScreen`).
|
|
27
|
+
* - `isWarning` — the build is below the warning threshold; the caller
|
|
28
|
+
* can render a dismissible `Banner` or similar prompt.
|
|
29
|
+
*
|
|
30
|
+
* By default a single check runs on mount. Pass `pollingIntervalMs` and/or
|
|
31
|
+
* `recheckOnForeground` to keep long-lived sessions up to date.
|
|
32
|
+
*
|
|
33
|
+
* @param options - Optional polling and foreground re-check configuration.
|
|
34
|
+
* @returns Current upgrade status, messages, and an `onUpdate` callback.
|
|
35
|
+
*/
|
|
36
|
+
export declare const useUpgradeCheck: (options?: UseUpgradeCheckOptions) => UseUpgradeCheckResult;
|
|
8
37
|
export {};
|
|
9
38
|
//# sourceMappingURL=useUpgradeCheck.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpgradeCheck.d.ts","sourceRoot":"","sources":["../src/useUpgradeCheck.ts"],"names":[],"mappings":"AAQA,UAAU,qBAAqB;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"useUpgradeCheck.d.ts","sourceRoot":"","sources":["../src/useUpgradeCheck.ts"],"names":[],"mappings":"AAQA,UAAU,sBAAsB;IAC9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,qBAAqB;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,sBAAsB,KAAG,qBAkHlE,CAAC"}
|