@take-out/better-auth-utils 0.7.0 → 0.7.1-1784516570419
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/cjs/createAuthClient.cjs +7 -2
- package/dist/cjs/createAuthClient.native.js +7 -3
- package/dist/cjs/createAuthClient.native.js.map +1 -1
- package/dist/cjs/createAuthClient.test.cjs +88 -0
- package/dist/cjs/createAuthClient.test.native.js +105 -0
- package/dist/cjs/createAuthClient.test.native.js.map +1 -0
- package/dist/esm/createAuthClient.mjs +7 -2
- package/dist/esm/createAuthClient.mjs.map +1 -1
- package/dist/esm/createAuthClient.native.js +7 -3
- package/dist/esm/createAuthClient.native.js.map +1 -1
- package/dist/esm/createAuthClient.test.mjs +89 -0
- package/dist/esm/createAuthClient.test.mjs.map +1 -0
- package/dist/esm/createAuthClient.test.native.js +103 -0
- package/dist/esm/createAuthClient.test.native.js.map +1 -0
- package/package.json +5 -3
- package/src/createAuthClient.test.ts +86 -0
- package/src/createAuthClient.ts +10 -3
- package/types/createAuthClient.d.ts.map +1 -1
- package/types/createAuthClient.test.d.ts +3 -0
- package/types/createAuthClient.test.d.ts.map +11 -0
|
@@ -219,12 +219,17 @@ function createBetterAuthClient(options) {
|
|
|
219
219
|
const proxiedAuthClient = new Proxy(authClient, {
|
|
220
220
|
get(_target, key) {
|
|
221
221
|
if (key === "signOut") {
|
|
222
|
-
return () => {
|
|
222
|
+
return async () => {
|
|
223
|
+
const result = await authClient.$fetch("/sign-out", {
|
|
224
|
+
method: "POST",
|
|
225
|
+
body: {}
|
|
226
|
+
});
|
|
227
|
+
if (result.error) throw result.error;
|
|
223
228
|
clearState();
|
|
224
|
-
authClient.signOut?.();
|
|
225
229
|
if (typeof window !== "undefined") {
|
|
226
230
|
window.location?.reload?.();
|
|
227
231
|
}
|
|
232
|
+
return result;
|
|
228
233
|
};
|
|
229
234
|
}
|
|
230
235
|
return Reflect.get(authClient, key);
|
|
@@ -245,14 +245,18 @@ function createBetterAuthClient(options) {
|
|
|
245
245
|
var proxiedAuthClient = new Proxy(authClient, {
|
|
246
246
|
get(_target, key) {
|
|
247
247
|
if (key === "signOut") {
|
|
248
|
-
return function () {
|
|
249
|
-
var
|
|
248
|
+
return async function () {
|
|
249
|
+
var result = await authClient.$fetch("/sign-out", {
|
|
250
|
+
method: "POST",
|
|
251
|
+
body: {}
|
|
252
|
+
});
|
|
253
|
+
if (result.error) throw result.error;
|
|
250
254
|
clearState();
|
|
251
|
-
(_authClient_signOut = authClient.signOut) === null || _authClient_signOut === void 0 ? void 0 : _authClient_signOut.call(authClient);
|
|
252
255
|
if (typeof window !== "undefined") {
|
|
253
256
|
var _window_location_reload, _window_location;
|
|
254
257
|
(_window_location = window.location) === null || _window_location === void 0 ? void 0 : (_window_location_reload = _window_location.reload) === null || _window_location_reload === void 0 ? void 0 : _window_location_reload.call(_window_location);
|
|
255
258
|
}
|
|
259
|
+
return result;
|
|
256
260
|
};
|
|
257
261
|
}
|
|
258
262
|
return Reflect.get(authClient, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createAuthClient_exports","__export","createBetterAuthClient","module","exports","import_helpers","require","import_client","options","onAuthStateChange","onAuthError","createUser","storagePrefix","retryDelay","useJWT","authCookieNames","authClientOptions","empty","state","session","user","token","keysStorage","createStorageValue","stateStorage","createAuthClientWithSession","createAuthClient","fetchOptions","credentials","headers","Authorization","authClient","_keysStorage_get","existingSession","get","authState","createEmitter","comparator","isEqualDeepLite","authClientVersion","setState","update","current","next","set","emit","setAuthClientToken","props","updateAuthClient","Math","random","subscribeToAuthEffect","dispose","retryTimer","consecutiveFailures","useSession","subscribe","_authState_value","data","dataGeneric","isPending","error","_keysStorage_get1","hasPersistedSession","scheduleAuthRetry","min","pow","hasPersistedSession1","nextState","_data_session","sessionUpdate","previousSession","isNewSession","id","userId","getValidToken","then","delayMs","clearTimeout","setTimeout","_res_data","res","$fetch","console","statusText","clearAuthClientToken","remove","clearAuthCookies","document","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","done","cookieName","cookie","domain","window","location","hostname","startsWith","slice","err","return","clearAllAuth","clearState","getAuth","loggedIn","useAuth","useEmitterValue"],"sources":["../../src/createAuthClient.ts"],"sourcesContent":[null],"mappings":"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
|
|
1
|
+
{"version":3,"names":["__toCommonJS","mod","__copyProps","__defProp","value","createAuthClient_exports","__export","createBetterAuthClient","module","exports","import_helpers","require","import_client","options","onAuthStateChange","onAuthError","createUser","storagePrefix","retryDelay","useJWT","authCookieNames","authClientOptions","empty","state","session","user","token","keysStorage","createStorageValue","stateStorage","createAuthClientWithSession","createAuthClient","fetchOptions","credentials","headers","Authorization","authClient","_keysStorage_get","existingSession","get","authState","createEmitter","comparator","isEqualDeepLite","authClientVersion","setState","update","current","next","set","emit","setAuthClientToken","props","updateAuthClient","Math","random","subscribeToAuthEffect","dispose","retryTimer","consecutiveFailures","useSession","subscribe","_authState_value","data","dataGeneric","isPending","error","_keysStorage_get1","hasPersistedSession","scheduleAuthRetry","min","pow","hasPersistedSession1","nextState","_data_session","sessionUpdate","previousSession","isNewSession","id","userId","getValidToken","then","delayMs","clearTimeout","setTimeout","_res_data","res","$fetch","console","statusText","clearAuthClientToken","remove","clearAuthCookies","document","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","done","cookieName","cookie","domain","window","location","hostname","startsWith","slice","err","return","clearAllAuth","clearState","getAuth","loggedIn","useAuth","useEmitterValue","addEventListener","cleanup"],"sources":["../../src/createAuthClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
var import_vitest = require("vitest");
|
|
2
|
+
var import_createAuthClient = require("./createAuthClient.cjs");
|
|
3
|
+
const mocks = import_vitest.vi.hoisted(() => ({
|
|
4
|
+
createAuthClient: import_vitest.vi.fn(),
|
|
5
|
+
request: import_vitest.vi.fn()
|
|
6
|
+
}));
|
|
7
|
+
import_vitest.vi.mock("better-auth/client", () => ({
|
|
8
|
+
createAuthClient: mocks.createAuthClient
|
|
9
|
+
}));
|
|
10
|
+
import_vitest.vi.mock("@take-out/helpers", () => ({
|
|
11
|
+
createEmitter: (_name, initialValue) => {
|
|
12
|
+
const emitter = {
|
|
13
|
+
value: initialValue,
|
|
14
|
+
emit(value) {
|
|
15
|
+
emitter.value = value;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
return emitter;
|
|
19
|
+
},
|
|
20
|
+
createStorageValue: () => ({
|
|
21
|
+
get: () => void 0,
|
|
22
|
+
set: import_vitest.vi.fn(),
|
|
23
|
+
remove: import_vitest.vi.fn()
|
|
24
|
+
}),
|
|
25
|
+
isEqualDeepLite: Object.is,
|
|
26
|
+
useEmitterValue: emitter => emitter.value
|
|
27
|
+
}));
|
|
28
|
+
(0, import_vitest.describe)("createBetterAuthClient signOut", () => {
|
|
29
|
+
(0, import_vitest.beforeEach)(() => {
|
|
30
|
+
mocks.request.mockReset();
|
|
31
|
+
mocks.createAuthClient.mockReset();
|
|
32
|
+
mocks.createAuthClient.mockReturnValue({
|
|
33
|
+
$fetch: mocks.request,
|
|
34
|
+
useSession: {
|
|
35
|
+
subscribe: import_vitest.vi.fn(() => import_vitest.vi.fn())
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
(0, import_vitest.test)("sends JSON and clears local auth only after server revocation succeeds", async () => {
|
|
40
|
+
const deferred = Promise.withResolvers();
|
|
41
|
+
mocks.request.mockReturnValue(deferred.promise);
|
|
42
|
+
const onAuthStateChange = import_vitest.vi.fn();
|
|
43
|
+
const client = (0, import_createAuthClient.createBetterAuthClient)({
|
|
44
|
+
baseURL: "https://auth.example.com",
|
|
45
|
+
onAuthStateChange
|
|
46
|
+
});
|
|
47
|
+
const pending = client.authClient.signOut();
|
|
48
|
+
(0, import_vitest.expect)(mocks.request).toHaveBeenCalledWith("/sign-out", {
|
|
49
|
+
method: "POST",
|
|
50
|
+
body: {}
|
|
51
|
+
});
|
|
52
|
+
(0, import_vitest.expect)(onAuthStateChange).not.toHaveBeenCalled();
|
|
53
|
+
deferred.resolve({
|
|
54
|
+
data: {
|
|
55
|
+
success: true
|
|
56
|
+
},
|
|
57
|
+
error: null
|
|
58
|
+
});
|
|
59
|
+
await (0, import_vitest.expect)(pending).resolves.toEqual({
|
|
60
|
+
data: {
|
|
61
|
+
success: true
|
|
62
|
+
},
|
|
63
|
+
error: null
|
|
64
|
+
});
|
|
65
|
+
(0, import_vitest.expect)(onAuthStateChange).toHaveBeenCalledWith({
|
|
66
|
+
state: "logged-out",
|
|
67
|
+
session: null,
|
|
68
|
+
user: null,
|
|
69
|
+
token: null
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
(0, import_vitest.test)("keeps local auth when server revocation fails", async () => {
|
|
73
|
+
const error = {
|
|
74
|
+
message: "network unavailable"
|
|
75
|
+
};
|
|
76
|
+
mocks.request.mockResolvedValue({
|
|
77
|
+
data: null,
|
|
78
|
+
error
|
|
79
|
+
});
|
|
80
|
+
const onAuthStateChange = import_vitest.vi.fn();
|
|
81
|
+
const client = (0, import_createAuthClient.createBetterAuthClient)({
|
|
82
|
+
baseURL: "https://auth.example.com",
|
|
83
|
+
onAuthStateChange
|
|
84
|
+
});
|
|
85
|
+
await (0, import_vitest.expect)(client.authClient.signOut()).rejects.toBe(error);
|
|
86
|
+
(0, import_vitest.expect)(onAuthStateChange).not.toHaveBeenCalled();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var import_vitest = require("vitest");
|
|
4
|
+
var import_createAuthClient = require("./createAuthClient.native.js");
|
|
5
|
+
var mocks = import_vitest.vi.hoisted(function () {
|
|
6
|
+
return {
|
|
7
|
+
createAuthClient: import_vitest.vi.fn(),
|
|
8
|
+
request: import_vitest.vi.fn()
|
|
9
|
+
};
|
|
10
|
+
});
|
|
11
|
+
import_vitest.vi.mock("better-auth/client", function () {
|
|
12
|
+
return {
|
|
13
|
+
createAuthClient: mocks.createAuthClient
|
|
14
|
+
};
|
|
15
|
+
});
|
|
16
|
+
import_vitest.vi.mock("@take-out/helpers", function () {
|
|
17
|
+
return {
|
|
18
|
+
createEmitter: function (_name, initialValue) {
|
|
19
|
+
var emitter = {
|
|
20
|
+
value: initialValue,
|
|
21
|
+
emit(value) {
|
|
22
|
+
emitter.value = value;
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
return emitter;
|
|
26
|
+
},
|
|
27
|
+
createStorageValue: function () {
|
|
28
|
+
return {
|
|
29
|
+
get: function () {
|
|
30
|
+
return void 0;
|
|
31
|
+
},
|
|
32
|
+
set: import_vitest.vi.fn(),
|
|
33
|
+
remove: import_vitest.vi.fn()
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
isEqualDeepLite: Object.is,
|
|
37
|
+
useEmitterValue: function (emitter) {
|
|
38
|
+
return emitter.value;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
(0, import_vitest.describe)("createBetterAuthClient signOut", function () {
|
|
43
|
+
(0, import_vitest.beforeEach)(function () {
|
|
44
|
+
mocks.request.mockReset();
|
|
45
|
+
mocks.createAuthClient.mockReset();
|
|
46
|
+
mocks.createAuthClient.mockReturnValue({
|
|
47
|
+
$fetch: mocks.request,
|
|
48
|
+
useSession: {
|
|
49
|
+
subscribe: import_vitest.vi.fn(function () {
|
|
50
|
+
return import_vitest.vi.fn();
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
(0, import_vitest.test)("sends JSON and clears local auth only after server revocation succeeds", async function () {
|
|
56
|
+
var deferred = Promise.withResolvers();
|
|
57
|
+
mocks.request.mockReturnValue(deferred.promise);
|
|
58
|
+
var onAuthStateChange = import_vitest.vi.fn();
|
|
59
|
+
var client = (0, import_createAuthClient.createBetterAuthClient)({
|
|
60
|
+
baseURL: "https://auth.example.com",
|
|
61
|
+
onAuthStateChange
|
|
62
|
+
});
|
|
63
|
+
var pending = client.authClient.signOut();
|
|
64
|
+
(0, import_vitest.expect)(mocks.request).toHaveBeenCalledWith("/sign-out", {
|
|
65
|
+
method: "POST",
|
|
66
|
+
body: {}
|
|
67
|
+
});
|
|
68
|
+
(0, import_vitest.expect)(onAuthStateChange).not.toHaveBeenCalled();
|
|
69
|
+
deferred.resolve({
|
|
70
|
+
data: {
|
|
71
|
+
success: true
|
|
72
|
+
},
|
|
73
|
+
error: null
|
|
74
|
+
});
|
|
75
|
+
await (0, import_vitest.expect)(pending).resolves.toEqual({
|
|
76
|
+
data: {
|
|
77
|
+
success: true
|
|
78
|
+
},
|
|
79
|
+
error: null
|
|
80
|
+
});
|
|
81
|
+
(0, import_vitest.expect)(onAuthStateChange).toHaveBeenCalledWith({
|
|
82
|
+
state: "logged-out",
|
|
83
|
+
session: null,
|
|
84
|
+
user: null,
|
|
85
|
+
token: null
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
(0, import_vitest.test)("keeps local auth when server revocation fails", async function () {
|
|
89
|
+
var error = {
|
|
90
|
+
message: "network unavailable"
|
|
91
|
+
};
|
|
92
|
+
mocks.request.mockResolvedValue({
|
|
93
|
+
data: null,
|
|
94
|
+
error
|
|
95
|
+
});
|
|
96
|
+
var onAuthStateChange = import_vitest.vi.fn();
|
|
97
|
+
var client = (0, import_createAuthClient.createBetterAuthClient)({
|
|
98
|
+
baseURL: "https://auth.example.com",
|
|
99
|
+
onAuthStateChange
|
|
100
|
+
});
|
|
101
|
+
await (0, import_vitest.expect)(client.authClient.signOut()).rejects.toBe(error);
|
|
102
|
+
(0, import_vitest.expect)(onAuthStateChange).not.toHaveBeenCalled();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
//# sourceMappingURL=createAuthClient.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["import_vitest","require","import_createAuthClient","mocks","vi","hoisted","createAuthClient","fn","request","mock","createEmitter","_name","initialValue","emitter","value","emit","createStorageValue","get","set","remove","isEqualDeepLite","Object","is","useEmitterValue","describe","beforeEach","mockReset","mockReturnValue","$fetch","useSession","subscribe","test","deferred","Promise","withResolvers","promise","onAuthStateChange","client","createBetterAuthClient","baseURL","pending","authClient","signOut","expect","toHaveBeenCalledWith","method","body","not","toHaveBeenCalled","resolve","data","success","error"],"sources":["../../src/createAuthClient.test.ts"],"sourcesContent":[null],"mappings":"AAAA;;AA8BA,IAAAA,aAAA,GAAAC,OAAA,SAAuC;AA5BvC,IAAAC,uBAAc,GAAAD,OAAG,+BAAe;AAAA,IAC9BE,KAAA,GAAAH,aAAkB,CAAAI,EAAA,CAAAC,OAAA,CAAG,YAAG;EACxB;IACAC,gBAAA,EAAAN,aAAA,CAAAI,EAAA,CAAAG,EAAA;IAEFC,OAAA,EAAAR,aAAQ,CAAAI,EAAA,CAAAG,EAAA;EACN;AACF,EAAE;AAEFP,aAAA,CAAAI,EAAA,CAAGK,IAAA,CAAK,sBAAqB,YAAO;EAClC;IACEH,gBAAgB,EAAAH,KAAA,CAAAG;EAAA;AACP;AAELN,aAAA,CAAAI,EAAQ,CAAAK,IAAA,oBAAQ;EAAA,OAClB;IACFC,aAAA,WAAAA,CAAAC,KAAA,EAAAC,YAAA;MACA,IAAAC,OAAO;QACTC,KAAA,EAAAF,YAAA;QACAG,KAAAD,KAAA;UACOD,OAAM,CAAAC,KAAA,GAAAA,KAAA;QACX;MACA;MACF,OAAAD,OAAA;IACA;IACAG,kBAAkB,WAAAA,CAAA,EAAgC;MAClD;QAIFC,GAAA,WAAAA,CAAA;UACE;QACE;QACAC,GAAM,EAAAlB,aAAA,CAAiBI,EAAA,CAAAG,EAAA;QACvBY,MAAM,EAAAnB,aAAiB,CAAAI,EAAA,CAAAG,EAAA;MACrB;IAAc;IACFa,eACC,EAAAC,MAAA,CAAAC,EAAA;IAAmBC,eAChC,WAAAA,CAAAV,OAAA;MACD,OAAAA,OAAA,CAAAC,KAAA;IACF;EAED;AACE;AAIA,IAAAd,aAAM,CAAQwB,QAAA,kCAAgC;EAC9C,IAAAxB,aAAM,CAAAyB,UAAoB;IAC1BtB,KAAA,CAAMK,OAAA,CAAAkB,SAAS;IAAuBvB,KACpC,CAAAG,gBAAS,CAAAoB,SAAA;IAAAvB,KACT,CAAAG,gBAAA,CAAAqB,eAAA;MACDC,MAAA,EAAAzB,KAAA,CAAAK,OAAA;MAEDqB,UAAM;QACNC,SAAA,EAAA9B,aAAO,CAAAI,EAAA,CAAMG,EAAA,aAAS;UACpB,OAAQP,aAAA,CAAAI,EAAA,CAAAG,EAAA;QACR;MACD;IACD;EAEA;EACA,IAAAP,aAAM,CAAA+B,IAAA,0EAAmE,oBAAM;IAC/E,IAAAC,QAAA,GAAAC,OAAA,CAAAC,aAAO;IAAwC/B,KAC7C,CAAAK,OAAO,CAAAmB,eAAA,CAAAK,QAAA,CAAAG,OAAA;IAAA,IACPC,iBAAS,GAAApC,aAAA,CAAAI,EAAA,CAAAG,EAAA;IAAA,IACT8B,MAAM,OAAAnC,uBAAA,CAAAoC,sBAAA;MACNC,OAAO;MACRH;IACF;IAED,IAAAI,OAAA,GAAAH,MAAA,CAAAI,UAAK,CAAAC,OAAA;IACH,IAAA1C,aAAgB,CAAA2C,MAAA,EAASxC,KAAA,CAAAK,OAAA,EAAAoC,oBAAsB;MAC/CC,MAAM,QAAQ;MACdC,IAAM;IACN;IAAsC,EACpC,EAAA9C,aAAS,CAAA2C,MAAA,EAAAP,iBAAA,EAAAW,GAAA,CAAAC,gBAAA;IAAAhB,QACT,CAAAiB,OAAA;MACDC,IAAA;QAEDC,OAAM;MACN;MACDC,KAAA;IACF","ignoreList":[]}
|
|
@@ -192,12 +192,17 @@ function createBetterAuthClient(options) {
|
|
|
192
192
|
const proxiedAuthClient = new Proxy(authClient, {
|
|
193
193
|
get(_target, key) {
|
|
194
194
|
if (key === "signOut") {
|
|
195
|
-
return () => {
|
|
195
|
+
return async () => {
|
|
196
|
+
const result = await authClient.$fetch("/sign-out", {
|
|
197
|
+
method: "POST",
|
|
198
|
+
body: {}
|
|
199
|
+
});
|
|
200
|
+
if (result.error) throw result.error;
|
|
196
201
|
clearState();
|
|
197
|
-
authClient.signOut?.();
|
|
198
202
|
if (typeof window !== "undefined") {
|
|
199
203
|
window.location?.reload?.();
|
|
200
204
|
}
|
|
205
|
+
return result;
|
|
201
206
|
};
|
|
202
207
|
}
|
|
203
208
|
return Reflect.get(authClient, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createEmitter","createStorageValue","isEqualDeepLite","useEmitterValue","createAuthClient","createBetterAuthClient","options","onAuthStateChange","onAuthError","createUser","storagePrefix","retryDelay","useJWT","authCookieNames","authClientOptions","empty","state","session","user","token","keysStorage","stateStorage","createAuthClientWithSession","fetchOptions","credentials","headers","Authorization","authClient","existingSession","get","authState","comparator","authClientVersion","setState","update","current","value","next","set","emit","setAuthClientToken","props","updateAuthClient","Math","random","subscribeToAuthEffect","dispose","retryTimer","consecutiveFailures","useSession","subscribe","data","dataGeneric","isPending","error","hasPersistedSession2","scheduleAuthRetry","min","hasPersistedSession","nextState","sessionUpdate","previousSession","isNewSession","id","userId","getValidToken","then","delayMs","clearTimeout","setTimeout","res","$fetch","console","statusText","clearAuthClientToken","remove","clearAuthCookies","document","cookieName","cookie","domain","window","location","hostname","startsWith","slice","clearAllAuth","clearState","getAuth","loggedIn","useAuth","addEventListener","cleanup","proxiedAuthClient","Proxy","_target","key","
|
|
1
|
+
{"version":3,"names":["createEmitter","createStorageValue","isEqualDeepLite","useEmitterValue","createAuthClient","createBetterAuthClient","options","onAuthStateChange","onAuthError","createUser","storagePrefix","retryDelay","useJWT","authCookieNames","authClientOptions","empty","state","session","user","token","keysStorage","stateStorage","createAuthClientWithSession","fetchOptions","credentials","headers","Authorization","authClient","existingSession","get","authState","comparator","authClientVersion","setState","update","current","value","next","set","emit","setAuthClientToken","props","updateAuthClient","Math","random","subscribeToAuthEffect","dispose","retryTimer","consecutiveFailures","useSession","subscribe","data","dataGeneric","isPending","error","hasPersistedSession2","scheduleAuthRetry","min","hasPersistedSession","nextState","sessionUpdate","previousSession","isNewSession","id","userId","getValidToken","then","delayMs","clearTimeout","setTimeout","res","$fetch","console","statusText","clearAuthClientToken","remove","clearAuthCookies","document","cookieName","cookie","domain","window","location","hostname","startsWith","slice","clearAllAuth","clearState","getAuth","loggedIn","useAuth","addEventListener","cleanup","proxiedAuthClient","Proxy","_target","key","result","method","body","reload","Reflect"],"sources":["../../src/createAuthClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -216,14 +216,18 @@ function createBetterAuthClient(options) {
|
|
|
216
216
|
var proxiedAuthClient = new Proxy(authClient, {
|
|
217
217
|
get(_target, key) {
|
|
218
218
|
if (key === "signOut") {
|
|
219
|
-
return function () {
|
|
220
|
-
var
|
|
219
|
+
return async function () {
|
|
220
|
+
var result = await authClient.$fetch("/sign-out", {
|
|
221
|
+
method: "POST",
|
|
222
|
+
body: {}
|
|
223
|
+
});
|
|
224
|
+
if (result.error) throw result.error;
|
|
221
225
|
clearState();
|
|
222
|
-
(_authClient_signOut = authClient.signOut) === null || _authClient_signOut === void 0 ? void 0 : _authClient_signOut.call(authClient);
|
|
223
226
|
if (typeof window !== "undefined") {
|
|
224
227
|
var _window_location_reload, _window_location;
|
|
225
228
|
(_window_location = window.location) === null || _window_location === void 0 ? void 0 : (_window_location_reload = _window_location.reload) === null || _window_location_reload === void 0 ? void 0 : _window_location_reload.call(_window_location);
|
|
226
229
|
}
|
|
230
|
+
return result;
|
|
227
231
|
};
|
|
228
232
|
}
|
|
229
233
|
return Reflect.get(authClient, key);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["createEmitter","createStorageValue","isEqualDeepLite","useEmitterValue","createAuthClient","createBetterAuthClient","options","onAuthStateChange","onAuthError","createUser","storagePrefix","retryDelay","useJWT","authCookieNames","authClientOptions","empty","state","session","user","token","keysStorage","stateStorage","createAuthClientWithSession","fetchOptions","credentials","headers","Authorization","authClient","_keysStorage_get","existingSession","get","authState","comparator","authClientVersion","setState","update","current","value","next","set","emit","setAuthClientToken","props","updateAuthClient","Math","random","subscribeToAuthEffect","dispose","retryTimer","consecutiveFailures","useSession","subscribe","_authState_value","data","dataGeneric","isPending","error","_keysStorage_get1","hasPersistedSession","scheduleAuthRetry","min","pow","hasPersistedSession1","nextState","_data_session","sessionUpdate","previousSession","isNewSession","id","userId","getValidToken","then","delayMs","clearTimeout","setTimeout","_res_data","res","$fetch","console","statusText","clearAuthClientToken","remove","clearAuthCookies","document","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","done","cookieName","cookie","domain","window","location","hostname","startsWith","slice","err","return","clearAllAuth","clearState","getAuth","loggedIn","useAuth","addEventListener","cleanup"],"sources":["../../src/createAuthClient.ts"],"sourcesContent":[null],"mappings":"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
|
|
1
|
+
{"version":3,"names":["createEmitter","createStorageValue","isEqualDeepLite","useEmitterValue","createAuthClient","createBetterAuthClient","options","onAuthStateChange","onAuthError","createUser","storagePrefix","retryDelay","useJWT","authCookieNames","authClientOptions","empty","state","session","user","token","keysStorage","stateStorage","createAuthClientWithSession","fetchOptions","credentials","headers","Authorization","authClient","_keysStorage_get","existingSession","get","authState","comparator","authClientVersion","setState","update","current","value","next","set","emit","setAuthClientToken","props","updateAuthClient","Math","random","subscribeToAuthEffect","dispose","retryTimer","consecutiveFailures","useSession","subscribe","_authState_value","data","dataGeneric","isPending","error","_keysStorage_get1","hasPersistedSession","scheduleAuthRetry","min","pow","hasPersistedSession1","nextState","_data_session","sessionUpdate","previousSession","isNewSession","id","userId","getValidToken","then","delayMs","clearTimeout","setTimeout","_res_data","res","$fetch","console","statusText","clearAuthClientToken","remove","clearAuthCookies","document","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_iterator","Symbol","iterator","_step","done","cookieName","cookie","domain","window","location","hostname","startsWith","slice","err","return","clearAllAuth","clearState","getAuth","loggedIn","useAuth","addEventListener","cleanup","proxiedAuthClient","Proxy","_target","key"],"sources":["../../src/createAuthClient.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
import { createBetterAuthClient } from "./createAuthClient.mjs";
|
|
3
|
+
const mocks = vi.hoisted(() => ({
|
|
4
|
+
createAuthClient: vi.fn(),
|
|
5
|
+
request: vi.fn()
|
|
6
|
+
}));
|
|
7
|
+
vi.mock("better-auth/client", () => ({
|
|
8
|
+
createAuthClient: mocks.createAuthClient
|
|
9
|
+
}));
|
|
10
|
+
vi.mock("@take-out/helpers", () => ({
|
|
11
|
+
createEmitter: (_name, initialValue) => {
|
|
12
|
+
const emitter = {
|
|
13
|
+
value: initialValue,
|
|
14
|
+
emit(value) {
|
|
15
|
+
emitter.value = value;
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
return emitter;
|
|
19
|
+
},
|
|
20
|
+
createStorageValue: () => ({
|
|
21
|
+
get: () => void 0,
|
|
22
|
+
set: vi.fn(),
|
|
23
|
+
remove: vi.fn()
|
|
24
|
+
}),
|
|
25
|
+
isEqualDeepLite: Object.is,
|
|
26
|
+
useEmitterValue: emitter => emitter.value
|
|
27
|
+
}));
|
|
28
|
+
describe("createBetterAuthClient signOut", () => {
|
|
29
|
+
beforeEach(() => {
|
|
30
|
+
mocks.request.mockReset();
|
|
31
|
+
mocks.createAuthClient.mockReset();
|
|
32
|
+
mocks.createAuthClient.mockReturnValue({
|
|
33
|
+
$fetch: mocks.request,
|
|
34
|
+
useSession: {
|
|
35
|
+
subscribe: vi.fn(() => vi.fn())
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
test("sends JSON and clears local auth only after server revocation succeeds", async () => {
|
|
40
|
+
const deferred = Promise.withResolvers();
|
|
41
|
+
mocks.request.mockReturnValue(deferred.promise);
|
|
42
|
+
const onAuthStateChange = vi.fn();
|
|
43
|
+
const client = createBetterAuthClient({
|
|
44
|
+
baseURL: "https://auth.example.com",
|
|
45
|
+
onAuthStateChange
|
|
46
|
+
});
|
|
47
|
+
const pending = client.authClient.signOut();
|
|
48
|
+
expect(mocks.request).toHaveBeenCalledWith("/sign-out", {
|
|
49
|
+
method: "POST",
|
|
50
|
+
body: {}
|
|
51
|
+
});
|
|
52
|
+
expect(onAuthStateChange).not.toHaveBeenCalled();
|
|
53
|
+
deferred.resolve({
|
|
54
|
+
data: {
|
|
55
|
+
success: true
|
|
56
|
+
},
|
|
57
|
+
error: null
|
|
58
|
+
});
|
|
59
|
+
await expect(pending).resolves.toEqual({
|
|
60
|
+
data: {
|
|
61
|
+
success: true
|
|
62
|
+
},
|
|
63
|
+
error: null
|
|
64
|
+
});
|
|
65
|
+
expect(onAuthStateChange).toHaveBeenCalledWith({
|
|
66
|
+
state: "logged-out",
|
|
67
|
+
session: null,
|
|
68
|
+
user: null,
|
|
69
|
+
token: null
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
test("keeps local auth when server revocation fails", async () => {
|
|
73
|
+
const error = {
|
|
74
|
+
message: "network unavailable"
|
|
75
|
+
};
|
|
76
|
+
mocks.request.mockResolvedValue({
|
|
77
|
+
data: null,
|
|
78
|
+
error
|
|
79
|
+
});
|
|
80
|
+
const onAuthStateChange = vi.fn();
|
|
81
|
+
const client = createBetterAuthClient({
|
|
82
|
+
baseURL: "https://auth.example.com",
|
|
83
|
+
onAuthStateChange
|
|
84
|
+
});
|
|
85
|
+
await expect(client.authClient.signOut()).rejects.toBe(error);
|
|
86
|
+
expect(onAuthStateChange).not.toHaveBeenCalled();
|
|
87
|
+
});
|
|
88
|
+
});
|
|
89
|
+
//# sourceMappingURL=createAuthClient.test.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","test","vi","createBetterAuthClient","mocks","hoisted","createAuthClient","fn","request","mock","createEmitter","_name","initialValue","emitter","value","emit","createStorageValue","get","set","remove","isEqualDeepLite","Object","is","useEmitterValue","mockReset","mockReturnValue","$fetch","useSession","subscribe","deferred","Promise","withResolvers","promise","onAuthStateChange","client","baseURL","pending","authClient","signOut","toHaveBeenCalledWith","method","body","not","toHaveBeenCalled","resolve","data","success","error","resolves","toEqual","state","session","user","token","message","mockResolvedValue","rejects","toBe"],"sources":["../../src/createAuthClient.test.ts"],"sourcesContent":[null],"mappings":"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","ignoreList":[]}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from "vitest";
|
|
2
|
+
import { createBetterAuthClient } from "./createAuthClient.native.js";
|
|
3
|
+
var mocks = vi.hoisted(function () {
|
|
4
|
+
return {
|
|
5
|
+
createAuthClient: vi.fn(),
|
|
6
|
+
request: vi.fn()
|
|
7
|
+
};
|
|
8
|
+
});
|
|
9
|
+
vi.mock("better-auth/client", function () {
|
|
10
|
+
return {
|
|
11
|
+
createAuthClient: mocks.createAuthClient
|
|
12
|
+
};
|
|
13
|
+
});
|
|
14
|
+
vi.mock("@take-out/helpers", function () {
|
|
15
|
+
return {
|
|
16
|
+
createEmitter: function (_name, initialValue) {
|
|
17
|
+
var emitter = {
|
|
18
|
+
value: initialValue,
|
|
19
|
+
emit(value) {
|
|
20
|
+
emitter.value = value;
|
|
21
|
+
}
|
|
22
|
+
};
|
|
23
|
+
return emitter;
|
|
24
|
+
},
|
|
25
|
+
createStorageValue: function () {
|
|
26
|
+
return {
|
|
27
|
+
get: function () {
|
|
28
|
+
return void 0;
|
|
29
|
+
},
|
|
30
|
+
set: vi.fn(),
|
|
31
|
+
remove: vi.fn()
|
|
32
|
+
};
|
|
33
|
+
},
|
|
34
|
+
isEqualDeepLite: Object.is,
|
|
35
|
+
useEmitterValue: function (emitter) {
|
|
36
|
+
return emitter.value;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
});
|
|
40
|
+
describe("createBetterAuthClient signOut", function () {
|
|
41
|
+
beforeEach(function () {
|
|
42
|
+
mocks.request.mockReset();
|
|
43
|
+
mocks.createAuthClient.mockReset();
|
|
44
|
+
mocks.createAuthClient.mockReturnValue({
|
|
45
|
+
$fetch: mocks.request,
|
|
46
|
+
useSession: {
|
|
47
|
+
subscribe: vi.fn(function () {
|
|
48
|
+
return vi.fn();
|
|
49
|
+
})
|
|
50
|
+
}
|
|
51
|
+
});
|
|
52
|
+
});
|
|
53
|
+
test("sends JSON and clears local auth only after server revocation succeeds", async function () {
|
|
54
|
+
var deferred = Promise.withResolvers();
|
|
55
|
+
mocks.request.mockReturnValue(deferred.promise);
|
|
56
|
+
var onAuthStateChange = vi.fn();
|
|
57
|
+
var client = createBetterAuthClient({
|
|
58
|
+
baseURL: "https://auth.example.com",
|
|
59
|
+
onAuthStateChange
|
|
60
|
+
});
|
|
61
|
+
var pending = client.authClient.signOut();
|
|
62
|
+
expect(mocks.request).toHaveBeenCalledWith("/sign-out", {
|
|
63
|
+
method: "POST",
|
|
64
|
+
body: {}
|
|
65
|
+
});
|
|
66
|
+
expect(onAuthStateChange).not.toHaveBeenCalled();
|
|
67
|
+
deferred.resolve({
|
|
68
|
+
data: {
|
|
69
|
+
success: true
|
|
70
|
+
},
|
|
71
|
+
error: null
|
|
72
|
+
});
|
|
73
|
+
await expect(pending).resolves.toEqual({
|
|
74
|
+
data: {
|
|
75
|
+
success: true
|
|
76
|
+
},
|
|
77
|
+
error: null
|
|
78
|
+
});
|
|
79
|
+
expect(onAuthStateChange).toHaveBeenCalledWith({
|
|
80
|
+
state: "logged-out",
|
|
81
|
+
session: null,
|
|
82
|
+
user: null,
|
|
83
|
+
token: null
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
test("keeps local auth when server revocation fails", async function () {
|
|
87
|
+
var error = {
|
|
88
|
+
message: "network unavailable"
|
|
89
|
+
};
|
|
90
|
+
mocks.request.mockResolvedValue({
|
|
91
|
+
data: null,
|
|
92
|
+
error
|
|
93
|
+
});
|
|
94
|
+
var onAuthStateChange = vi.fn();
|
|
95
|
+
var client = createBetterAuthClient({
|
|
96
|
+
baseURL: "https://auth.example.com",
|
|
97
|
+
onAuthStateChange
|
|
98
|
+
});
|
|
99
|
+
await expect(client.authClient.signOut()).rejects.toBe(error);
|
|
100
|
+
expect(onAuthStateChange).not.toHaveBeenCalled();
|
|
101
|
+
});
|
|
102
|
+
});
|
|
103
|
+
//# sourceMappingURL=createAuthClient.test.native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["beforeEach","describe","expect","test","vi","createBetterAuthClient","mocks","hoisted","createAuthClient","fn","request","mock","createEmitter","_name","initialValue","emitter","value","emit","createStorageValue","get","set","remove","isEqualDeepLite","Object","is","useEmitterValue","mockReset","mockReturnValue","$fetch","useSession","subscribe","deferred","Promise","withResolvers","promise","onAuthStateChange","client","baseURL","pending","authClient","signOut","toHaveBeenCalledWith","method","body","not","toHaveBeenCalled","resolve","data","success","error","resolves","toEqual"],"sources":["../../src/createAuthClient.test.ts"],"sourcesContent":[null],"mappings":"AAAA,SAASA,UAAA,EAAYC,QAAA,EAAUC,MAAA,EAAQC,IAAA,EAAMC,EAAA,QAAU;AA8BvD,SAASC,sBAAA,QAA8B;AA5BvC,IAAAC,KAAM,GAAAF,EAAQ,CAAAG,OAAG,aAAe;EAC9B;IACAC,gBAAe,EAAAJ,EAAA,CAAAK,EAAA;IACfC,OAAA,EAAAN,EAAA,CAAAK,EAAA;EAEF,CAAG;AAAkC,EACnC;AACFL,EAAE,CAAAO,IAAA;EAEF,OAAQ;IACNH,gBAAgB,EAAAF,KAAe,CAAAE;EAC7B;AAAgB;AACPJ,EAAA,CAAAO,IACP,oBAAqB;EACnB;IAAgBC,aAClB,WAAAA,CAAAC,KAAA,EAAAC,YAAA;MACF,IAAAC,OAAA;QACAC,KAAO,EAAAF,YAAA;QACTG,KAAAD,KAAA;UACAD,OAAA,CAAAC,KAAoB,GAAAA,KAAO;QACzB;MACA;MACA,OAAQD,OAAM;IAChB;IACAG,kBAAiB,WAAAA,CAAA,EAAO;MACxB;QACAC,GAAA,WAAAA,CAAA;UAIO;QACP;QACEC,GAAM,EAAAhB,EAAA,CAAAK,EAAQ;QACdY,MAAM,EAAAjB,EAAA,CAAAK,EAAA;MACN;IAAuC;IACvBa,eACF,EAAAC,MAAA,CAAAC,EAAA;IAAAC,eACC,WAAAA,CAAMV,OAAY,EAAC;MAChC,OAAAA,OAAA,CAAAC,KAAA;IACF;EACF,CAAC;AAED;AACEf,QAAA,iCAAyB,EAGtB;EACHD,UAAM,aAAQ;IACdM,KAAA,CAAMI,OAAA,CAAAgB,SAAA;IACNpB,KAAA,CAAME,gBAAS,CAAAkB,SAAA;IAAuBpB,KACpC,CAAAE,gBAAS,CAAAmB,eAAA;MACTC,MAAA,EAAAtB,KAAA,CAAAI,OAAA;MACDmB,UAAA;QAEDC,SAAM,EAAA1B,EAAU,CAAAK,EAAA,aAAO;UACvB,OAAaL,EAAA,CAAAK,EAAA,EAAO;QAClB;MACA;IACF,CAAC;EACD;EAEAN,IAAA,yEAAyD;IACzD,IAAA4B,QAAM,GAAOC,OAAS,CAAAC,aAAS;IAC/B3B,KAAA,CAAAI,OAAO,CAAAiB,eAAmB,CAAAI,QAAA,CAAAG,OAAA,CAAqB;IAAA,IAC7CC,iBAAO,GAAA/B,EAAA,CAAAK,EAAA;IAAA,IACP2B,MAAA,GAAS/B,sBAAA;MACTgC,OAAM;MACNF;IACF,CAAC;IACF,IAAAG,OAAA,GAAAF,MAAA,CAAAG,UAAA,CAAAC,OAAA;IAEDtC,MAAK,CAAAI,KAAA,CAAAI,OAAA,EAAA+B,oBAAA,YAAiD;MACpDC,MAAM,QAAU;MAChBC,IAAM;IACN;IACAzC,MAAM,CAAAiC,iBAAS,EAAAS,GAAA,CAAAC,gBAAuB;IAAAd,QACpC,CAAAe,OAAS;MACTC,IAAA;QACDC,OAAA;MAED;MACAC,KAAO;IACR;IACF,MAAA/C,MAAA,CAAAoC,OAAA,EAAAY,QAAA,CAAAC,OAAA","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@take-out/better-auth-utils",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.1-1784516570419",
|
|
4
4
|
"description": "Better auth utilities and client for React/React Native applications",
|
|
5
5
|
"sideEffects": false,
|
|
6
6
|
"type": "module",
|
|
@@ -16,6 +16,7 @@
|
|
|
16
16
|
"scripts": {
|
|
17
17
|
"build": "tamagui-build --skip-types",
|
|
18
18
|
"watch": "tamagui-build --skip-types --watch",
|
|
19
|
+
"test": "vitest run",
|
|
19
20
|
"lint": "oxlint src",
|
|
20
21
|
"lint:fix": "oxfmt src && oxlint --fix --fix-suggestions src",
|
|
21
22
|
"clean": "tamagui-build clean",
|
|
@@ -38,7 +39,7 @@
|
|
|
38
39
|
}
|
|
39
40
|
},
|
|
40
41
|
"dependencies": {
|
|
41
|
-
"@take-out/helpers": "0.7.
|
|
42
|
+
"@take-out/helpers": "0.7.1-1784516570419",
|
|
42
43
|
"jose": "^6.0.10"
|
|
43
44
|
},
|
|
44
45
|
"peerDependencies": {
|
|
@@ -51,7 +52,8 @@
|
|
|
51
52
|
"@types/react": "^19.0.8",
|
|
52
53
|
"oxfmt": "^0.16.0",
|
|
53
54
|
"oxlint": "^1.31.0",
|
|
54
|
-
"react": "*"
|
|
55
|
+
"react": "*",
|
|
56
|
+
"vitest": "4.1.0"
|
|
55
57
|
},
|
|
56
58
|
"publishConfig": {
|
|
57
59
|
"access": "public"
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { beforeEach, describe, expect, test, vi } from 'vitest'
|
|
2
|
+
|
|
3
|
+
const mocks = vi.hoisted(() => ({
|
|
4
|
+
createAuthClient: vi.fn(),
|
|
5
|
+
request: vi.fn(),
|
|
6
|
+
}))
|
|
7
|
+
|
|
8
|
+
vi.mock('better-auth/client', () => ({
|
|
9
|
+
createAuthClient: mocks.createAuthClient,
|
|
10
|
+
}))
|
|
11
|
+
|
|
12
|
+
vi.mock('@take-out/helpers', () => ({
|
|
13
|
+
createEmitter: (_name: string, initialValue: unknown) => {
|
|
14
|
+
const emitter = {
|
|
15
|
+
value: initialValue,
|
|
16
|
+
emit(value: unknown) {
|
|
17
|
+
emitter.value = value
|
|
18
|
+
},
|
|
19
|
+
}
|
|
20
|
+
return emitter
|
|
21
|
+
},
|
|
22
|
+
createStorageValue: () => ({
|
|
23
|
+
get: () => undefined,
|
|
24
|
+
set: vi.fn(),
|
|
25
|
+
remove: vi.fn(),
|
|
26
|
+
}),
|
|
27
|
+
isEqualDeepLite: Object.is,
|
|
28
|
+
useEmitterValue: (emitter: { value: unknown }) => emitter.value,
|
|
29
|
+
}))
|
|
30
|
+
|
|
31
|
+
import { createBetterAuthClient } from './createAuthClient'
|
|
32
|
+
|
|
33
|
+
describe('createBetterAuthClient signOut', () => {
|
|
34
|
+
beforeEach(() => {
|
|
35
|
+
mocks.request.mockReset()
|
|
36
|
+
mocks.createAuthClient.mockReset()
|
|
37
|
+
mocks.createAuthClient.mockReturnValue({
|
|
38
|
+
$fetch: mocks.request,
|
|
39
|
+
useSession: {
|
|
40
|
+
subscribe: vi.fn(() => vi.fn()),
|
|
41
|
+
},
|
|
42
|
+
})
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test('sends JSON and clears local auth only after server revocation succeeds', async () => {
|
|
46
|
+
const deferred = Promise.withResolvers<{
|
|
47
|
+
data: { success: true }
|
|
48
|
+
error: null
|
|
49
|
+
}>()
|
|
50
|
+
mocks.request.mockReturnValue(deferred.promise)
|
|
51
|
+
const onAuthStateChange = vi.fn()
|
|
52
|
+
const client = createBetterAuthClient({
|
|
53
|
+
baseURL: 'https://auth.example.com',
|
|
54
|
+
onAuthStateChange,
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const pending = client.authClient.signOut()
|
|
58
|
+
expect(mocks.request).toHaveBeenCalledWith('/sign-out', {
|
|
59
|
+
method: 'POST',
|
|
60
|
+
body: {},
|
|
61
|
+
})
|
|
62
|
+
expect(onAuthStateChange).not.toHaveBeenCalled()
|
|
63
|
+
|
|
64
|
+
deferred.resolve({ data: { success: true }, error: null })
|
|
65
|
+
await expect(pending).resolves.toEqual({ data: { success: true }, error: null })
|
|
66
|
+
expect(onAuthStateChange).toHaveBeenCalledWith({
|
|
67
|
+
state: 'logged-out',
|
|
68
|
+
session: null,
|
|
69
|
+
user: null,
|
|
70
|
+
token: null,
|
|
71
|
+
})
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
test('keeps local auth when server revocation fails', async () => {
|
|
75
|
+
const error = { message: 'network unavailable' }
|
|
76
|
+
mocks.request.mockResolvedValue({ data: null, error })
|
|
77
|
+
const onAuthStateChange = vi.fn()
|
|
78
|
+
const client = createBetterAuthClient({
|
|
79
|
+
baseURL: 'https://auth.example.com',
|
|
80
|
+
onAuthStateChange,
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
await expect(client.authClient.signOut()).rejects.toBe(error)
|
|
84
|
+
expect(onAuthStateChange).not.toHaveBeenCalled()
|
|
85
|
+
})
|
|
86
|
+
})
|
package/src/createAuthClient.ts
CHANGED
|
@@ -337,13 +337,20 @@ export function createBetterAuthClient<const Opts extends BetterAuthClientProps<
|
|
|
337
337
|
const proxiedAuthClient = new Proxy(authClient, {
|
|
338
338
|
get(_target, key) {
|
|
339
339
|
if (key === 'signOut') {
|
|
340
|
-
return () => {
|
|
340
|
+
return async () => {
|
|
341
|
+
// an explicit empty body makes better-fetch send JSON instead of a
|
|
342
|
+
// bodyless POST, which Better Auth rejects with 415.
|
|
343
|
+
const result = await authClient.$fetch('/sign-out', {
|
|
344
|
+
method: 'POST',
|
|
345
|
+
body: {},
|
|
346
|
+
})
|
|
347
|
+
if (result.error) throw result.error
|
|
348
|
+
|
|
341
349
|
clearState()
|
|
342
|
-
// @ts-expect-error better-auth type issue
|
|
343
|
-
authClient.signOut?.()
|
|
344
350
|
if (typeof window !== 'undefined') {
|
|
345
351
|
window.location?.reload?.()
|
|
346
352
|
}
|
|
353
|
+
return result
|
|
347
354
|
}
|
|
348
355
|
}
|
|
349
356
|
return Reflect.get(authClient, key)
|
|
@@ -6,6 +6,6 @@
|
|
|
6
6
|
],
|
|
7
7
|
"version": 3,
|
|
8
8
|
"sourcesContent": [
|
|
9
|
-
"/**\n * Better-auth helpers for React / React Native applications\n *\n * Features:\n * - Session persistence in local storage\n * - State management with emitters\n * - Automatic retry on errors\n * - Optional JWT support (for Tauri, React Native)\n */\n\nimport {\n createEmitter,\n createStorageValue,\n type Emitter,\n isEqualDeepLite,\n useEmitterValue,\n} from '@take-out/helpers'\nimport { type BetterAuthClientOptions, createAuthClient } from 'better-auth/client'\n\nimport type { Session, User } from 'better-auth'\n\nexport interface StorageKeys {\n token: string\n session: string\n}\n\nexport type AuthState<U extends User = User> = {\n state: 'loading' | 'logged-in' | 'logged-out'\n session: Session | null\n user: U | null\n /** JWT token - only populated when useJWT is enabled */\n token: string | null\n}\n\nexport interface BetterAuthClientProps<\n TUser extends User = User,\n> extends BetterAuthClientOptions {\n /**\n * Callback to transform and type the user object\n * @default (user) => user\n */\n createUser?: (user: User) => TUser\n\n /**\n * Optional callback when authentication state changes\n */\n onAuthStateChange?: (state: AuthState<TUser>) => void\n\n /**\n * Optional callback for handling auth errors\n */\n onAuthError?: (error: any) => void\n\n /**\n * Storage key prefix for local storage\n * @default 'auth'\n */\n storagePrefix?: string\n\n /**\n * Retry delay in milliseconds after auth errors\n * @default 4000\n */\n retryDelay?: number\n\n /**\n * Enable JWT token management for native apps (Tauri, React Native)\n * When false (default), auth uses session cookies forwarded by the server\n * When true, fetches and manages JWT tokens for Authorization header auth\n * @default false\n */\n useJWT?: boolean\n\n /**\n * Cookie names to clear on auth invalidation\n * @default ['better-auth.jwt', 'better-auth.session_token']\n */\n authCookieNames?: string[]\n}\n\nexport interface BetterAuthClientReturn<U extends User = User, TClient = any> {\n clearState: () => void\n authState: ReturnType<typeof createEmitter<AuthState<U>>>\n authClient: TClient\n setAuthClientToken: (props: { token: string; session: string }) => Promise<void>\n clearAuthClientToken: () => void\n clearAllAuth: () => void\n useAuth: () => AuthState<U>\n getAuth: () => AuthState<U> & { loggedIn: boolean }\n getValidToken: () => Promise<string | undefined>\n updateAuthClient: (session: string) => void\n authClientVersion: Emitter<number>\n}\n\ntype InferUser<T> = T extends { createUser?: (user: User) => infer R }\n ? R extends User\n ? R\n : User\n : User\n\nexport function createBetterAuthClient<const Opts extends BetterAuthClientProps<any>>(\n options: Opts,\n): BetterAuthClientReturn<InferUser<Opts>, ReturnType<typeof createAuthClient<Opts>>> {\n type TUser = InferUser<Opts>\n const {\n onAuthStateChange,\n onAuthError,\n createUser,\n storagePrefix = 'auth',\n retryDelay = 4000,\n useJWT = false,\n authCookieNames = ['better-auth.jwt', 'better-auth.session_token'],\n ...authClientOptions\n } = options\n\n const empty: AuthState<TUser> = {\n state: 'logged-out',\n session: null,\n user: null,\n token: null,\n }\n\n const keysStorage = createStorageValue<StorageKeys>(`${storagePrefix}-keys`)\n const stateStorage = createStorageValue<AuthState<TUser>>(`${storagePrefix}-state`)\n\n const createAuthClientWithSession = (session: string) => {\n return createAuthClient({\n ...authClientOptions,\n fetchOptions: {\n credentials: 'include',\n headers: session ? { Authorization: `Bearer ${session}` } : undefined,\n },\n })\n }\n\n let authClient = (() => {\n const existingSession = keysStorage.get()?.session\n return existingSession\n ? createAuthClientWithSession(existingSession)\n : createAuthClient({\n ...authClientOptions,\n fetchOptions: { credentials: 'include' },\n } as Opts)\n })()\n\n const authState = createEmitter<AuthState<TUser>>(\n 'authState',\n stateStorage.get() || empty,\n { comparator: isEqualDeepLite },\n )\n\n const authClientVersion = createEmitter<number>('authClientVersion', 0)\n\n const setState = (update: Partial<AuthState<TUser>>) => {\n const current = authState.value!\n const next = { ...current, ...update }\n stateStorage.set(next)\n authState.emit(next)\n\n // update storage keys\n if (next.token && next.session) {\n keysStorage.set({\n token: next.token,\n session: next.session.token,\n })\n } else if (next.session) {\n keysStorage.set({\n token: '',\n session: next.session.token,\n })\n } else {\n keysStorage.set({ token: '', session: '' })\n }\n\n onAuthStateChange?.(next)\n }\n\n const setAuthClientToken = async (props: { token: string; session: string }) => {\n keysStorage.set(props)\n updateAuthClient(props.session)\n }\n\n function updateAuthClient(session: string) {\n authClient = createAuthClientWithSession(session)\n authClientVersion.emit(Math.random())\n subscribeToAuthEffect()\n }\n\n let dispose: Function | null = null\n let retryTimer: ReturnType<typeof setTimeout> | null = null\n // consecutive poll failures drive exponential backoff. a fixed retry clock\n // is self-defeating against a rate limiter: one 429 puts the client on a\n // cadence that keeps it over the limit forever (a real device wedged this\n // way — every 4s retry re-tripped the server's window and the session never\n // confirmed). backoff doubles per consecutive failure up to 60s and resets\n // on any successful poll.\n let consecutiveFailures = 0\n\n function subscribeToAuthEffect() {\n dispose?.()\n\n dispose = authClient.useSession.subscribe(async (props) => {\n const { data: dataGeneric, isPending, error } = props\n\n if (error) {\n onAuthError?.(error)\n // if no persisted session, transition to logged-out instead of staying loading\n const hasPersistedSession = !!keysStorage.get()?.session\n if (!hasPersistedSession) {\n setState({ state: 'logged-out', session: null, user: null })\n }\n consecutiveFailures++\n scheduleAuthRetry(Math.min(retryDelay * 2 ** (consecutiveFailures - 1), 60_000))\n return\n }\n\n consecutiveFailures = 0\n\n const data = dataGeneric as\n | undefined\n | {\n session?: AuthState<TUser>['session']\n user?: AuthState<TUser>['user']\n }\n\n // if we have a persisted session but server hasn't confirmed yet, stay loading\n const hasPersistedSession = !!keysStorage.get()?.session\n const nextState = isPending\n ? 'loading'\n : data?.session\n ? 'logged-in'\n : hasPersistedSession && data === undefined\n ? 'loading'\n : 'logged-out'\n\n // only update session/user when we have definitive data\n const sessionUpdate =\n nextState === 'loading'\n ? {}\n : {\n session: data?.session ?? null,\n user: data?.user ? (createUser ? createUser(data.user) : data.user) : null,\n }\n\n // detect new session\n const previousSession = authState.value?.session\n const isNewSession =\n data?.session &&\n (!previousSession ||\n previousSession.id !== data.session.id ||\n previousSession.userId !== data.session.userId)\n\n setState({\n state: nextState,\n ...sessionUpdate,\n })\n\n // fetch JWT token when useJWT is enabled (for native/tauri apps)\n if (useJWT && data?.session && (isNewSession || !authState.value.token)) {\n if (isNewSession && authState.value.token) {\n setState({ token: null })\n }\n\n getValidToken().then((token) => {\n if (token) {\n setState({ token })\n }\n })\n }\n })\n }\n\n function scheduleAuthRetry(delayMs: number) {\n if (retryTimer) clearTimeout(retryTimer)\n retryTimer = setTimeout(() => {\n retryTimer = null\n subscribeToAuthEffect()\n }, delayMs)\n }\n\n async function getValidToken(): Promise<string | undefined> {\n const res = await authClient.$fetch('/token')\n if (res.error) {\n console.error(`Error fetching token: ${res.error.statusText}`)\n return undefined\n }\n return (res.data as any)?.token as string | undefined\n }\n\n const clearAuthClientToken = () => {\n keysStorage.remove()\n }\n\n function clearAuthCookies() {\n if (typeof document === 'undefined') return\n\n for (const cookieName of authCookieNames) {\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`\n const domain = window.location.hostname\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain}`\n if (domain.startsWith('.')) {\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain.slice(1)}`\n }\n }\n }\n\n function clearAllAuth() {\n clearAuthCookies()\n clearState()\n }\n\n const getAuth = () => {\n const state = authState?.value || empty\n return { ...state, loggedIn: !!state.session }\n }\n\n const useAuth = () => {\n return useEmitterValue(authState) || empty\n }\n\n function clearState() {\n keysStorage.remove()\n stateStorage.remove()\n setState(empty)\n }\n\n subscribeToAuthEffect()\n\n if (typeof window !== 'undefined' && window.addEventListener) {\n const cleanup = () => {\n dispose?.()\n if (retryTimer) clearTimeout(retryTimer)\n }\n window.addEventListener('beforeunload', cleanup)\n }\n\n const proxiedAuthClient = new Proxy(authClient, {\n get(_target, key) {\n if (key === 'signOut') {\n return () => {\n clearState()\n // @ts-expect-error better-auth type issue\n authClient.signOut?.()\n if (typeof window !== 'undefined') {\n window.location?.reload?.()\n }\n }\n }\n return Reflect.get(authClient, key)\n },\n }) as ReturnType<typeof createAuthClient<Opts>>\n\n return {\n authClientVersion,\n clearState,\n authState,\n authClient: proxiedAuthClient,\n setAuthClientToken,\n clearAuthClientToken,\n clearAllAuth,\n useAuth,\n getAuth,\n getValidToken,\n updateAuthClient,\n }\n}\n"
|
|
9
|
+
"/**\n * Better-auth helpers for React / React Native applications\n *\n * Features:\n * - Session persistence in local storage\n * - State management with emitters\n * - Automatic retry on errors\n * - Optional JWT support (for Tauri, React Native)\n */\n\nimport {\n createEmitter,\n createStorageValue,\n type Emitter,\n isEqualDeepLite,\n useEmitterValue,\n} from '@take-out/helpers'\nimport { type BetterAuthClientOptions, createAuthClient } from 'better-auth/client'\n\nimport type { Session, User } from 'better-auth'\n\nexport interface StorageKeys {\n token: string\n session: string\n}\n\nexport type AuthState<U extends User = User> = {\n state: 'loading' | 'logged-in' | 'logged-out'\n session: Session | null\n user: U | null\n /** JWT token - only populated when useJWT is enabled */\n token: string | null\n}\n\nexport interface BetterAuthClientProps<\n TUser extends User = User,\n> extends BetterAuthClientOptions {\n /**\n * Callback to transform and type the user object\n * @default (user) => user\n */\n createUser?: (user: User) => TUser\n\n /**\n * Optional callback when authentication state changes\n */\n onAuthStateChange?: (state: AuthState<TUser>) => void\n\n /**\n * Optional callback for handling auth errors\n */\n onAuthError?: (error: any) => void\n\n /**\n * Storage key prefix for local storage\n * @default 'auth'\n */\n storagePrefix?: string\n\n /**\n * Retry delay in milliseconds after auth errors\n * @default 4000\n */\n retryDelay?: number\n\n /**\n * Enable JWT token management for native apps (Tauri, React Native)\n * When false (default), auth uses session cookies forwarded by the server\n * When true, fetches and manages JWT tokens for Authorization header auth\n * @default false\n */\n useJWT?: boolean\n\n /**\n * Cookie names to clear on auth invalidation\n * @default ['better-auth.jwt', 'better-auth.session_token']\n */\n authCookieNames?: string[]\n}\n\nexport interface BetterAuthClientReturn<U extends User = User, TClient = any> {\n clearState: () => void\n authState: ReturnType<typeof createEmitter<AuthState<U>>>\n authClient: TClient\n setAuthClientToken: (props: { token: string; session: string }) => Promise<void>\n clearAuthClientToken: () => void\n clearAllAuth: () => void\n useAuth: () => AuthState<U>\n getAuth: () => AuthState<U> & { loggedIn: boolean }\n getValidToken: () => Promise<string | undefined>\n updateAuthClient: (session: string) => void\n authClientVersion: Emitter<number>\n}\n\ntype InferUser<T> = T extends { createUser?: (user: User) => infer R }\n ? R extends User\n ? R\n : User\n : User\n\nexport function createBetterAuthClient<const Opts extends BetterAuthClientProps<any>>(\n options: Opts,\n): BetterAuthClientReturn<InferUser<Opts>, ReturnType<typeof createAuthClient<Opts>>> {\n type TUser = InferUser<Opts>\n const {\n onAuthStateChange,\n onAuthError,\n createUser,\n storagePrefix = 'auth',\n retryDelay = 4000,\n useJWT = false,\n authCookieNames = ['better-auth.jwt', 'better-auth.session_token'],\n ...authClientOptions\n } = options\n\n const empty: AuthState<TUser> = {\n state: 'logged-out',\n session: null,\n user: null,\n token: null,\n }\n\n const keysStorage = createStorageValue<StorageKeys>(`${storagePrefix}-keys`)\n const stateStorage = createStorageValue<AuthState<TUser>>(`${storagePrefix}-state`)\n\n const createAuthClientWithSession = (session: string) => {\n return createAuthClient({\n ...authClientOptions,\n fetchOptions: {\n credentials: 'include',\n headers: session ? { Authorization: `Bearer ${session}` } : undefined,\n },\n })\n }\n\n let authClient = (() => {\n const existingSession = keysStorage.get()?.session\n return existingSession\n ? createAuthClientWithSession(existingSession)\n : createAuthClient({\n ...authClientOptions,\n fetchOptions: { credentials: 'include' },\n } as Opts)\n })()\n\n const authState = createEmitter<AuthState<TUser>>(\n 'authState',\n stateStorage.get() || empty,\n { comparator: isEqualDeepLite },\n )\n\n const authClientVersion = createEmitter<number>('authClientVersion', 0)\n\n const setState = (update: Partial<AuthState<TUser>>) => {\n const current = authState.value!\n const next = { ...current, ...update }\n stateStorage.set(next)\n authState.emit(next)\n\n // update storage keys\n if (next.token && next.session) {\n keysStorage.set({\n token: next.token,\n session: next.session.token,\n })\n } else if (next.session) {\n keysStorage.set({\n token: '',\n session: next.session.token,\n })\n } else {\n keysStorage.set({ token: '', session: '' })\n }\n\n onAuthStateChange?.(next)\n }\n\n const setAuthClientToken = async (props: { token: string; session: string }) => {\n keysStorage.set(props)\n updateAuthClient(props.session)\n }\n\n function updateAuthClient(session: string) {\n authClient = createAuthClientWithSession(session)\n authClientVersion.emit(Math.random())\n subscribeToAuthEffect()\n }\n\n let dispose: Function | null = null\n let retryTimer: ReturnType<typeof setTimeout> | null = null\n // consecutive poll failures drive exponential backoff. a fixed retry clock\n // is self-defeating against a rate limiter: one 429 puts the client on a\n // cadence that keeps it over the limit forever (a real device wedged this\n // way — every 4s retry re-tripped the server's window and the session never\n // confirmed). backoff doubles per consecutive failure up to 60s and resets\n // on any successful poll.\n let consecutiveFailures = 0\n\n function subscribeToAuthEffect() {\n dispose?.()\n\n dispose = authClient.useSession.subscribe(async (props) => {\n const { data: dataGeneric, isPending, error } = props\n\n if (error) {\n onAuthError?.(error)\n // if no persisted session, transition to logged-out instead of staying loading\n const hasPersistedSession = !!keysStorage.get()?.session\n if (!hasPersistedSession) {\n setState({ state: 'logged-out', session: null, user: null })\n }\n consecutiveFailures++\n scheduleAuthRetry(Math.min(retryDelay * 2 ** (consecutiveFailures - 1), 60_000))\n return\n }\n\n consecutiveFailures = 0\n\n const data = dataGeneric as\n | undefined\n | {\n session?: AuthState<TUser>['session']\n user?: AuthState<TUser>['user']\n }\n\n // if we have a persisted session but server hasn't confirmed yet, stay loading\n const hasPersistedSession = !!keysStorage.get()?.session\n const nextState = isPending\n ? 'loading'\n : data?.session\n ? 'logged-in'\n : hasPersistedSession && data === undefined\n ? 'loading'\n : 'logged-out'\n\n // only update session/user when we have definitive data\n const sessionUpdate =\n nextState === 'loading'\n ? {}\n : {\n session: data?.session ?? null,\n user: data?.user ? (createUser ? createUser(data.user) : data.user) : null,\n }\n\n // detect new session\n const previousSession = authState.value?.session\n const isNewSession =\n data?.session &&\n (!previousSession ||\n previousSession.id !== data.session.id ||\n previousSession.userId !== data.session.userId)\n\n setState({\n state: nextState,\n ...sessionUpdate,\n })\n\n // fetch JWT token when useJWT is enabled (for native/tauri apps)\n if (useJWT && data?.session && (isNewSession || !authState.value.token)) {\n if (isNewSession && authState.value.token) {\n setState({ token: null })\n }\n\n getValidToken().then((token) => {\n if (token) {\n setState({ token })\n }\n })\n }\n })\n }\n\n function scheduleAuthRetry(delayMs: number) {\n if (retryTimer) clearTimeout(retryTimer)\n retryTimer = setTimeout(() => {\n retryTimer = null\n subscribeToAuthEffect()\n }, delayMs)\n }\n\n async function getValidToken(): Promise<string | undefined> {\n const res = await authClient.$fetch('/token')\n if (res.error) {\n console.error(`Error fetching token: ${res.error.statusText}`)\n return undefined\n }\n return (res.data as any)?.token as string | undefined\n }\n\n const clearAuthClientToken = () => {\n keysStorage.remove()\n }\n\n function clearAuthCookies() {\n if (typeof document === 'undefined') return\n\n for (const cookieName of authCookieNames) {\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/`\n const domain = window.location.hostname\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain}`\n if (domain.startsWith('.')) {\n document.cookie = `${cookieName}=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/; domain=${domain.slice(1)}`\n }\n }\n }\n\n function clearAllAuth() {\n clearAuthCookies()\n clearState()\n }\n\n const getAuth = () => {\n const state = authState?.value || empty\n return { ...state, loggedIn: !!state.session }\n }\n\n const useAuth = () => {\n return useEmitterValue(authState) || empty\n }\n\n function clearState() {\n keysStorage.remove()\n stateStorage.remove()\n setState(empty)\n }\n\n subscribeToAuthEffect()\n\n if (typeof window !== 'undefined' && window.addEventListener) {\n const cleanup = () => {\n dispose?.()\n if (retryTimer) clearTimeout(retryTimer)\n }\n window.addEventListener('beforeunload', cleanup)\n }\n\n const proxiedAuthClient = new Proxy(authClient, {\n get(_target, key) {\n if (key === 'signOut') {\n return async () => {\n // an explicit empty body makes better-fetch send JSON instead of a\n // bodyless POST, which Better Auth rejects with 415.\n const result = await authClient.$fetch('/sign-out', {\n method: 'POST',\n body: {},\n })\n if (result.error) throw result.error\n\n clearState()\n if (typeof window !== 'undefined') {\n window.location?.reload?.()\n }\n return result\n }\n }\n return Reflect.get(authClient, key)\n },\n }) as ReturnType<typeof createAuthClient<Opts>>\n\n return {\n authClientVersion,\n clearState,\n authState,\n authClient: proxiedAuthClient,\n setAuthClientToken,\n clearAuthClientToken,\n clearAllAuth,\n useAuth,\n getAuth,\n getValidToken,\n updateAuthClient,\n }\n}\n"
|
|
10
10
|
]
|
|
11
11
|
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
{
|
|
2
|
+
"mappings": "",
|
|
3
|
+
"names": [],
|
|
4
|
+
"sources": [
|
|
5
|
+
"src/createAuthClient.test.ts"
|
|
6
|
+
],
|
|
7
|
+
"version": 3,
|
|
8
|
+
"sourcesContent": [
|
|
9
|
+
"import { beforeEach, describe, expect, test, vi } from 'vitest'\n\nconst mocks = vi.hoisted(() => ({\n createAuthClient: vi.fn(),\n request: vi.fn(),\n}))\n\nvi.mock('better-auth/client', () => ({\n createAuthClient: mocks.createAuthClient,\n}))\n\nvi.mock('@take-out/helpers', () => ({\n createEmitter: (_name: string, initialValue: unknown) => {\n const emitter = {\n value: initialValue,\n emit(value: unknown) {\n emitter.value = value\n },\n }\n return emitter\n },\n createStorageValue: () => ({\n get: () => undefined,\n set: vi.fn(),\n remove: vi.fn(),\n }),\n isEqualDeepLite: Object.is,\n useEmitterValue: (emitter: { value: unknown }) => emitter.value,\n}))\n\nimport { createBetterAuthClient } from './createAuthClient'\n\ndescribe('createBetterAuthClient signOut', () => {\n beforeEach(() => {\n mocks.request.mockReset()\n mocks.createAuthClient.mockReset()\n mocks.createAuthClient.mockReturnValue({\n $fetch: mocks.request,\n useSession: {\n subscribe: vi.fn(() => vi.fn()),\n },\n })\n })\n\n test('sends JSON and clears local auth only after server revocation succeeds', async () => {\n const deferred = Promise.withResolvers<{\n data: { success: true }\n error: null\n }>()\n mocks.request.mockReturnValue(deferred.promise)\n const onAuthStateChange = vi.fn()\n const client = createBetterAuthClient({\n baseURL: 'https://auth.example.com',\n onAuthStateChange,\n })\n\n const pending = client.authClient.signOut()\n expect(mocks.request).toHaveBeenCalledWith('/sign-out', {\n method: 'POST',\n body: {},\n })\n expect(onAuthStateChange).not.toHaveBeenCalled()\n\n deferred.resolve({ data: { success: true }, error: null })\n await expect(pending).resolves.toEqual({ data: { success: true }, error: null })\n expect(onAuthStateChange).toHaveBeenCalledWith({\n state: 'logged-out',\n session: null,\n user: null,\n token: null,\n })\n })\n\n test('keeps local auth when server revocation fails', async () => {\n const error = { message: 'network unavailable' }\n mocks.request.mockResolvedValue({ data: null, error })\n const onAuthStateChange = vi.fn()\n const client = createBetterAuthClient({\n baseURL: 'https://auth.example.com',\n onAuthStateChange,\n })\n\n await expect(client.authClient.signOut()).rejects.toBe(error)\n expect(onAuthStateChange).not.toHaveBeenCalled()\n })\n})\n"
|
|
10
|
+
]
|
|
11
|
+
}
|