@terreno/rtk 0.23.1 → 0.25.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authSlice.d.ts.map +1 -1
- package/dist/authSlice.js +9 -16
- package/dist/authSlice.js.map +1 -1
- package/dist/betterAuthSlice.d.ts +9 -5
- package/dist/betterAuthSlice.d.ts.map +1 -1
- package/dist/betterAuthSlice.js +7 -20
- package/dist/betterAuthSlice.js.map +1 -1
- package/dist/isolated/constants.test.d.ts +2 -0
- package/dist/isolated/constants.test.d.ts.map +1 -0
- package/dist/isolated/{constants.isolated.js → constants.test.js} +1 -1
- package/dist/isolated/constants.test.js.map +1 -0
- package/dist/useFeatureFlags.d.ts.map +1 -1
- package/dist/useFeatureFlags.js +4 -3
- package/dist/useFeatureFlags.js.map +1 -1
- package/dist/useRealtimeDebug.test.d.ts +2 -0
- package/dist/useRealtimeDebug.test.d.ts.map +1 -0
- package/dist/useRealtimeDebug.test.js +131 -0
- package/dist/useRealtimeDebug.test.js.map +1 -0
- package/dist/useServerStatus.test.js +49 -0
- package/dist/useServerStatus.test.js.map +1 -1
- package/dist/useTerrenoFeatureFlags.test.js +27 -0
- package/dist/useTerrenoFeatureFlags.test.js.map +1 -1
- package/dist/useUpgradeCheck.test.d.ts +2 -0
- package/dist/useUpgradeCheck.test.d.ts.map +1 -0
- package/dist/useUpgradeCheck.test.js +174 -0
- package/dist/useUpgradeCheck.test.js.map +1 -0
- package/dist/useUpgradeCheckNative.test.d.ts +2 -0
- package/dist/useUpgradeCheckNative.test.d.ts.map +1 -0
- package/dist/useUpgradeCheckNative.test.js +90 -0
- package/dist/useUpgradeCheckNative.test.js.map +1 -0
- package/package.json +2 -2
- package/src/authSlice.ts +28 -14
- package/src/betterAuthSlice.ts +19 -18
- package/src/useFeatureFlags.ts +4 -3
- package/src/useRealtimeDebug.test.ts +173 -0
- package/src/useServerStatus.test.ts +68 -0
- package/src/useTerrenoFeatureFlags.test.ts +40 -0
- package/src/useUpgradeCheck.test.ts +226 -0
- package/src/useUpgradeCheckNative.test.ts +124 -0
- package/dist/isolated/constants.isolated.d.ts +0 -2
- package/dist/isolated/constants.isolated.d.ts.map +0 -1
- package/dist/isolated/constants.isolated.js.map +0 -1
- /package/src/isolated/{constants.isolated.ts → constants.test.ts} +0 -0
|
@@ -145,6 +145,18 @@ describe("useTerrenoFeatureFlags ref-count cleanup", () => {
|
|
|
145
145
|
afterEach(async () => {
|
|
146
146
|
await OpenFeature.setProviderAndWait(refcountTestDomain, NOOP_PROVIDER);
|
|
147
147
|
});
|
|
148
|
+
it("awaits pending provider switch during cleanup when unmount overlaps setProviderAndWait", async () => {
|
|
149
|
+
const { api } = buildApi({ data: { alpha: boolDef("on") } });
|
|
150
|
+
// Render and immediately unmount before the provider switch resolves.
|
|
151
|
+
// This exercises the `await pending` path (line 119) in the cleanup.
|
|
152
|
+
const { unmount } = renderHook(() => useTerrenoFeatureFlags(api, { domain: refcountTestDomain, userId: "u-fast" }));
|
|
153
|
+
// Unmount immediately — cleanup fires while the provider switch is still in-flight
|
|
154
|
+
unmount();
|
|
155
|
+
// Allow microtasks (the pending await + NOOP install) to settle
|
|
156
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
157
|
+
// After cleanup the domain should have fallen back to NOOP
|
|
158
|
+
expect(OpenFeature.getClient(refcountTestDomain).getBooleanValue("alpha", false)).toBe(false);
|
|
159
|
+
});
|
|
148
160
|
it("installs NOOP provider after the last hook instance unmounts", async () => {
|
|
149
161
|
const { api } = buildApi({ data: { alpha: boolDef("on") } });
|
|
150
162
|
const { unmount } = renderHook(() => useTerrenoFeatureFlags(api, { domain: refcountTestDomain, userId: "u1" }));
|
|
@@ -156,5 +168,20 @@ describe("useTerrenoFeatureFlags ref-count cleanup", () => {
|
|
|
156
168
|
expect(OpenFeature.getClient(refcountTestDomain).getBooleanValue("alpha", false)).toBe(false);
|
|
157
169
|
}, { timeout: 5000 });
|
|
158
170
|
});
|
|
171
|
+
it("keeps the provider installed while another hook instance is still mounted", async () => {
|
|
172
|
+
const { api } = buildApi({ data: { alpha: boolDef("on") } });
|
|
173
|
+
// Two instances share the domain, so the ref count reaches 2.
|
|
174
|
+
const first = renderHook(() => useTerrenoFeatureFlags(api, { domain: refcountTestDomain, userId: "u1" }));
|
|
175
|
+
const second = renderHook(() => useTerrenoFeatureFlags(api, { domain: refcountTestDomain, userId: "u1" }));
|
|
176
|
+
await waitFor(() => {
|
|
177
|
+
expect(OpenFeature.getClient(refcountTestDomain).getBooleanValue("alpha", false)).toBe(true);
|
|
178
|
+
}, { timeout: 5000 });
|
|
179
|
+
// Unmounting one instance decrements the ref count to 1 (the else branch),
|
|
180
|
+
// so the provider must remain installed rather than falling back to NOOP.
|
|
181
|
+
first.unmount();
|
|
182
|
+
await new Promise((r) => setTimeout(r, 200));
|
|
183
|
+
expect(OpenFeature.getClient(refcountTestDomain).getBooleanValue("alpha", false)).toBe(true);
|
|
184
|
+
second.unmount();
|
|
185
|
+
});
|
|
159
186
|
});
|
|
160
187
|
//# sourceMappingURL=useTerrenoFeatureFlags.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTerrenoFeatureFlags.test.js","sourceRoot":"","sources":["../src/useTerrenoFeatureFlags.test.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTerrenoFeatureFlags.test.js","sourceRoot":"","sources":["../src/useTerrenoFeatureFlags.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpgradeCheck.test.d.ts","sourceRoot":"","sources":["../src/useUpgradeCheck.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
|
|
2
|
+
import { configureStore } from "@reduxjs/toolkit";
|
|
3
|
+
import { act, renderHook } from "@testing-library/react-native";
|
|
4
|
+
import Constants from "expo-constants";
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { Provider } from "react-redux";
|
|
7
|
+
// Capture the AppState "change" handler so tests can simulate foreground transitions.
|
|
8
|
+
let appStateChangeHandler;
|
|
9
|
+
const appStateMock = {
|
|
10
|
+
addEventListener: (_event, handler) => {
|
|
11
|
+
appStateChangeHandler = handler;
|
|
12
|
+
return { remove: () => { } };
|
|
13
|
+
},
|
|
14
|
+
currentState: "active",
|
|
15
|
+
};
|
|
16
|
+
// Keep this react-native mock a superset of the preload's mock so other test
|
|
17
|
+
// files still resolve AppState / Linking / Platform after this file runs.
|
|
18
|
+
mock.module("react-native", () => ({
|
|
19
|
+
AppState: appStateMock,
|
|
20
|
+
Linking: { openURL: async () => true },
|
|
21
|
+
Platform: { OS: "web" },
|
|
22
|
+
StyleSheet: { create: (s) => s },
|
|
23
|
+
}));
|
|
24
|
+
// Force IsWeb=true regardless of load order with the native test files.
|
|
25
|
+
mock.module("./platform", () => ({ IsWeb: true }));
|
|
26
|
+
const { emptySplitApi } = await import("./emptyApi");
|
|
27
|
+
const { useUpgradeCheck } = await import("./useUpgradeCheck");
|
|
28
|
+
const constantsWithExtra = Constants;
|
|
29
|
+
const createTestStore = () => configureStore({
|
|
30
|
+
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(emptySplitApi.middleware),
|
|
31
|
+
reducer: { [emptySplitApi.reducerPath]: emptySplitApi.reducer },
|
|
32
|
+
});
|
|
33
|
+
const createWrapper = (store) => {
|
|
34
|
+
const Wrapper = ({ children }) => React.createElement(Provider, { children, store });
|
|
35
|
+
return Wrapper;
|
|
36
|
+
};
|
|
37
|
+
const mockFetchWith = (payload) => {
|
|
38
|
+
const fetchFn = mock(async () => new Response(JSON.stringify(payload), {
|
|
39
|
+
headers: { "content-type": "application/json" },
|
|
40
|
+
status: 200,
|
|
41
|
+
}));
|
|
42
|
+
globalThis.fetch = fetchFn;
|
|
43
|
+
return fetchFn;
|
|
44
|
+
};
|
|
45
|
+
const flush = async (ms = 60) => {
|
|
46
|
+
await act(async () => {
|
|
47
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
describe("useUpgradeCheck (web)", () => {
|
|
51
|
+
let originalFetch;
|
|
52
|
+
let originalWindow;
|
|
53
|
+
beforeEach(() => {
|
|
54
|
+
originalFetch = globalThis.fetch;
|
|
55
|
+
originalWindow = globalThis.window;
|
|
56
|
+
appStateChangeHandler = undefined;
|
|
57
|
+
appStateMock.currentState = "active";
|
|
58
|
+
constantsWithExtra.expoConfig.extra.buildNumber = 100;
|
|
59
|
+
});
|
|
60
|
+
afterEach(() => {
|
|
61
|
+
globalThis.fetch = originalFetch;
|
|
62
|
+
globalThis.window = originalWindow;
|
|
63
|
+
delete constantsWithExtra.expoConfig.extra.buildNumber;
|
|
64
|
+
emptySplitApi.util.resetApiState();
|
|
65
|
+
});
|
|
66
|
+
it("does not call the backend when the build number is unavailable", async () => {
|
|
67
|
+
delete constantsWithExtra.expoConfig.extra.buildNumber;
|
|
68
|
+
const fetchFn = mockFetchWith({ status: "ok" });
|
|
69
|
+
const { result, unmount } = renderHook(() => useUpgradeCheck(), {
|
|
70
|
+
wrapper: createWrapper(createTestStore()),
|
|
71
|
+
});
|
|
72
|
+
await flush();
|
|
73
|
+
expect(fetchFn).not.toHaveBeenCalled();
|
|
74
|
+
expect(result.current.isRequired).toBe(false);
|
|
75
|
+
expect(result.current.isWarning).toBe(false);
|
|
76
|
+
unmount();
|
|
77
|
+
});
|
|
78
|
+
it("flags a required upgrade and adopts the server polling interval", async () => {
|
|
79
|
+
const fetchFn = mockFetchWith({
|
|
80
|
+
message: "Please update",
|
|
81
|
+
pollingIntervalMs: 999999,
|
|
82
|
+
status: "required",
|
|
83
|
+
updateUrl: "https://example.com/update",
|
|
84
|
+
});
|
|
85
|
+
const { result, unmount } = renderHook(() => useUpgradeCheck(), {
|
|
86
|
+
wrapper: createWrapper(createTestStore()),
|
|
87
|
+
});
|
|
88
|
+
await flush();
|
|
89
|
+
expect(fetchFn).toHaveBeenCalled();
|
|
90
|
+
expect(result.current.isRequired).toBe(true);
|
|
91
|
+
expect(result.current.requiredMessage).toBe("Please update");
|
|
92
|
+
expect(result.current.isWarning).toBe(false);
|
|
93
|
+
// On web the app can always self-update via reload.
|
|
94
|
+
expect(result.current.canUpdate).toBe(true);
|
|
95
|
+
unmount();
|
|
96
|
+
});
|
|
97
|
+
it("flags a warning upgrade and increments the warning check count", async () => {
|
|
98
|
+
const fetchFn = mockFetchWith({ message: "Update soon", status: "warning" });
|
|
99
|
+
const { result, unmount } = renderHook(() => useUpgradeCheck(), {
|
|
100
|
+
wrapper: createWrapper(createTestStore()),
|
|
101
|
+
});
|
|
102
|
+
await flush();
|
|
103
|
+
expect(fetchFn).toHaveBeenCalled();
|
|
104
|
+
expect(result.current.isWarning).toBe(true);
|
|
105
|
+
expect(result.current.warningMessage).toBe("Update soon");
|
|
106
|
+
expect(result.current.warningCheckCount).toBe(1);
|
|
107
|
+
expect(result.current.isRequired).toBe(false);
|
|
108
|
+
unmount();
|
|
109
|
+
});
|
|
110
|
+
it("clears upgrade state for an ok status", async () => {
|
|
111
|
+
mockFetchWith({ status: "ok" });
|
|
112
|
+
const { result, unmount } = renderHook(() => useUpgradeCheck(), {
|
|
113
|
+
wrapper: createWrapper(createTestStore()),
|
|
114
|
+
});
|
|
115
|
+
await flush();
|
|
116
|
+
expect(result.current.isRequired).toBe(false);
|
|
117
|
+
expect(result.current.isWarning).toBe(false);
|
|
118
|
+
unmount();
|
|
119
|
+
});
|
|
120
|
+
it("swallows version-check failures and stays in the default state", async () => {
|
|
121
|
+
const fetchFn = mock(async () => {
|
|
122
|
+
throw new Error("network down");
|
|
123
|
+
});
|
|
124
|
+
globalThis.fetch = fetchFn;
|
|
125
|
+
const { result, unmount } = renderHook(() => useUpgradeCheck(), {
|
|
126
|
+
wrapper: createWrapper(createTestStore()),
|
|
127
|
+
});
|
|
128
|
+
// Wait long enough for RTK Query's retry backoff to exhaust and reject.
|
|
129
|
+
await flush(7000);
|
|
130
|
+
expect(result.current.isRequired).toBe(false);
|
|
131
|
+
expect(result.current.isWarning).toBe(false);
|
|
132
|
+
unmount();
|
|
133
|
+
}, 20000);
|
|
134
|
+
it("reloads the page on web when onUpdate is invoked", async () => {
|
|
135
|
+
mockFetchWith({ status: "required", updateUrl: "https://example.com/update" });
|
|
136
|
+
const reload = mock(() => { });
|
|
137
|
+
globalThis.window = { location: { reload } };
|
|
138
|
+
const { result, unmount } = renderHook(() => useUpgradeCheck(), {
|
|
139
|
+
wrapper: createWrapper(createTestStore()),
|
|
140
|
+
});
|
|
141
|
+
await flush();
|
|
142
|
+
act(() => {
|
|
143
|
+
result.current.onUpdate();
|
|
144
|
+
});
|
|
145
|
+
expect(reload).toHaveBeenCalledTimes(1);
|
|
146
|
+
unmount();
|
|
147
|
+
});
|
|
148
|
+
it("polls repeatedly using the fallback interval", async () => {
|
|
149
|
+
const fetchFn = mockFetchWith({ status: "ok" });
|
|
150
|
+
const { unmount } = renderHook(() => useUpgradeCheck({ pollingIntervalMs: 20 }), {
|
|
151
|
+
wrapper: createWrapper(createTestStore()),
|
|
152
|
+
});
|
|
153
|
+
await flush(120);
|
|
154
|
+
expect(fetchFn.mock.calls.length).toBeGreaterThan(1);
|
|
155
|
+
unmount();
|
|
156
|
+
});
|
|
157
|
+
it("re-checks when the app returns to the foreground", async () => {
|
|
158
|
+
const fetchFn = mockFetchWith({ status: "ok" });
|
|
159
|
+
const { unmount } = renderHook(() => useUpgradeCheck({ recheckOnForeground: true }), {
|
|
160
|
+
wrapper: createWrapper(createTestStore()),
|
|
161
|
+
});
|
|
162
|
+
await flush();
|
|
163
|
+
const initialCalls = fetchFn.mock.calls.length;
|
|
164
|
+
expect(appStateChangeHandler).toBeDefined();
|
|
165
|
+
await act(async () => {
|
|
166
|
+
appStateChangeHandler?.("background");
|
|
167
|
+
appStateChangeHandler?.("active");
|
|
168
|
+
await new Promise((resolve) => setTimeout(resolve, 30));
|
|
169
|
+
});
|
|
170
|
+
expect(fetchFn.mock.calls.length).toBeGreaterThan(initialCalls);
|
|
171
|
+
unmount();
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
//# sourceMappingURL=useUpgradeCheck.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpgradeCheck.test.js","sourceRoot":"","sources":["../src/useUpgradeCheck.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpgradeCheckNative.test.d.ts","sourceRoot":"","sources":["../src/useUpgradeCheckNative.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
|
|
2
|
+
import { configureStore } from "@reduxjs/toolkit";
|
|
3
|
+
import { act, renderHook } from "@testing-library/react-native";
|
|
4
|
+
import Constants from "expo-constants";
|
|
5
|
+
import React from "react";
|
|
6
|
+
import { Provider } from "react-redux";
|
|
7
|
+
const openedUrls = [];
|
|
8
|
+
// Keep this react-native mock a superset of the preload's mock so other test
|
|
9
|
+
// files still resolve AppState / Linking / Platform after this file runs.
|
|
10
|
+
mock.module("react-native", () => ({
|
|
11
|
+
AppState: {
|
|
12
|
+
addEventListener: () => ({ remove: () => { } }),
|
|
13
|
+
currentState: "active",
|
|
14
|
+
},
|
|
15
|
+
Linking: {
|
|
16
|
+
openURL: async (url) => {
|
|
17
|
+
openedUrls.push(url);
|
|
18
|
+
return true;
|
|
19
|
+
},
|
|
20
|
+
},
|
|
21
|
+
Platform: { OS: "ios" },
|
|
22
|
+
StyleSheet: { create: (s) => s },
|
|
23
|
+
}));
|
|
24
|
+
// Force IsWeb=false so the mobile update path is exercised.
|
|
25
|
+
mock.module("./platform", () => ({ IsWeb: false }));
|
|
26
|
+
const { emptySplitApi } = await import("./emptyApi");
|
|
27
|
+
const { useUpgradeCheck } = await import("./useUpgradeCheck");
|
|
28
|
+
const constantsWithExtra = Constants;
|
|
29
|
+
const createTestStore = () => configureStore({
|
|
30
|
+
middleware: (getDefaultMiddleware) => getDefaultMiddleware().concat(emptySplitApi.middleware),
|
|
31
|
+
reducer: { [emptySplitApi.reducerPath]: emptySplitApi.reducer },
|
|
32
|
+
});
|
|
33
|
+
const createWrapper = (store) => {
|
|
34
|
+
const Wrapper = ({ children }) => React.createElement(Provider, { children, store });
|
|
35
|
+
return Wrapper;
|
|
36
|
+
};
|
|
37
|
+
const mockFetchWith = (payload) => {
|
|
38
|
+
globalThis.fetch = mock(async () => new Response(JSON.stringify(payload), {
|
|
39
|
+
headers: { "content-type": "application/json" },
|
|
40
|
+
status: 200,
|
|
41
|
+
}));
|
|
42
|
+
};
|
|
43
|
+
const flush = async (ms = 60) => {
|
|
44
|
+
await act(async () => {
|
|
45
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
describe("useUpgradeCheck (native)", () => {
|
|
49
|
+
let originalFetch;
|
|
50
|
+
beforeEach(() => {
|
|
51
|
+
originalFetch = globalThis.fetch;
|
|
52
|
+
openedUrls.length = 0;
|
|
53
|
+
constantsWithExtra.expoConfig.extra.buildNumber = 100;
|
|
54
|
+
});
|
|
55
|
+
afterEach(() => {
|
|
56
|
+
globalThis.fetch = originalFetch;
|
|
57
|
+
delete constantsWithExtra.expoConfig.extra.buildNumber;
|
|
58
|
+
emptySplitApi.util.resetApiState();
|
|
59
|
+
});
|
|
60
|
+
it("opens the update URL on native when onUpdate is invoked", async () => {
|
|
61
|
+
mockFetchWith({ status: "required", updateUrl: "https://example.com/app-update" });
|
|
62
|
+
const { result, unmount } = renderHook(() => useUpgradeCheck(), {
|
|
63
|
+
wrapper: createWrapper(createTestStore()),
|
|
64
|
+
});
|
|
65
|
+
await flush();
|
|
66
|
+
// canUpdate on native depends on having a resolved update URL.
|
|
67
|
+
expect(result.current.canUpdate).toBe(true);
|
|
68
|
+
await act(async () => {
|
|
69
|
+
result.current.onUpdate();
|
|
70
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
71
|
+
});
|
|
72
|
+
expect(openedUrls).toEqual(["https://example.com/app-update"]);
|
|
73
|
+
unmount();
|
|
74
|
+
});
|
|
75
|
+
it("does not open a URL on native when no update URL is available", async () => {
|
|
76
|
+
mockFetchWith({ status: "required" });
|
|
77
|
+
const { result, unmount } = renderHook(() => useUpgradeCheck(), {
|
|
78
|
+
wrapper: createWrapper(createTestStore()),
|
|
79
|
+
});
|
|
80
|
+
await flush();
|
|
81
|
+
expect(result.current.canUpdate).toBe(false);
|
|
82
|
+
await act(async () => {
|
|
83
|
+
result.current.onUpdate();
|
|
84
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
85
|
+
});
|
|
86
|
+
expect(openedUrls).toEqual([]);
|
|
87
|
+
unmount();
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
//# sourceMappingURL=useUpgradeCheckNative.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useUpgradeCheckNative.test.js","sourceRoot":"","sources":["../src/useUpgradeCheckNative.test.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"@openfeature/core": "^1.11.0",
|
|
5
5
|
"@react-native-async-storage/async-storage": "2.2.0",
|
|
6
6
|
"@reduxjs/toolkit": "^2.11.1",
|
|
7
|
-
"@terreno/ui": "0.
|
|
7
|
+
"@terreno/ui": "0.25.0",
|
|
8
8
|
"async-mutex": "^0.5.0",
|
|
9
9
|
"axios": "^1.13.2",
|
|
10
10
|
"axios-retry": "^4.5.0",
|
|
@@ -73,5 +73,5 @@
|
|
|
73
73
|
"test:coverage": "bun run ../scripts/check-coverage.ts"
|
|
74
74
|
},
|
|
75
75
|
"types": "dist/index.d.ts",
|
|
76
|
-
"version": "0.
|
|
76
|
+
"version": "0.25.0"
|
|
77
77
|
}
|
package/src/authSlice.ts
CHANGED
|
@@ -17,6 +17,24 @@ interface AuthState {
|
|
|
17
17
|
lastTokenRefreshTimestamp: number | null;
|
|
18
18
|
}
|
|
19
19
|
|
|
20
|
+
interface AuthErrorData {
|
|
21
|
+
message?: string;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
interface MutationFulfilledAction {
|
|
25
|
+
meta?: {
|
|
26
|
+
arg?: {
|
|
27
|
+
endpointName?: string;
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
payload?: {
|
|
31
|
+
refreshToken?: string;
|
|
32
|
+
token?: string;
|
|
33
|
+
userId?: string;
|
|
34
|
+
};
|
|
35
|
+
type: string;
|
|
36
|
+
}
|
|
37
|
+
|
|
20
38
|
export interface UserResponse {
|
|
21
39
|
data: {
|
|
22
40
|
userId: string;
|
|
@@ -117,9 +135,8 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
|
117
135
|
});
|
|
118
136
|
builder.addMatcher(
|
|
119
137
|
api.endpoints.emailLogin.matchRejected,
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
state.error = action.payload?.data?.message;
|
|
138
|
+
(state, action: PayloadAction<{data?: AuthErrorData}>) => {
|
|
139
|
+
state.error = action.payload?.data?.message ?? null;
|
|
123
140
|
state.isAuthenticating = false;
|
|
124
141
|
console.debug("Login rejected", action.payload?.data?.message);
|
|
125
142
|
}
|
|
@@ -136,9 +153,8 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
|
136
153
|
});
|
|
137
154
|
builder.addMatcher(
|
|
138
155
|
api.endpoints.emailSignUp.matchRejected,
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
state.error = action.payload?.data?.message;
|
|
156
|
+
(state, action: PayloadAction<{data?: AuthErrorData}>) => {
|
|
157
|
+
state.error = action.payload?.data?.message ?? null;
|
|
142
158
|
state.isAuthenticating = false;
|
|
143
159
|
console.debug("Signup rejected", action.payload);
|
|
144
160
|
}
|
|
@@ -158,9 +174,8 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
|
158
174
|
});
|
|
159
175
|
builder.addMatcher(
|
|
160
176
|
api.endpoints.googleLogin.matchRejected,
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
state.error = action.payload?.data?.message;
|
|
177
|
+
(state, action: PayloadAction<{data?: AuthErrorData}>) => {
|
|
178
|
+
state.error = action.payload?.data?.message ?? null;
|
|
164
179
|
state.isAuthenticating = false;
|
|
165
180
|
}
|
|
166
181
|
);
|
|
@@ -191,8 +206,7 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
|
191
206
|
// we need to use a listener middleware.
|
|
192
207
|
const loginListenerMiddleware = createListenerMiddleware();
|
|
193
208
|
loginListenerMiddleware.startListening({
|
|
194
|
-
|
|
195
|
-
effect: async (action: any, listenerApi) => {
|
|
209
|
+
effect: async (action: MutationFulfilledAction, listenerApi) => {
|
|
196
210
|
if (
|
|
197
211
|
action.payload?.token &&
|
|
198
212
|
(action.meta?.arg?.endpointName === "emailLogin" ||
|
|
@@ -206,7 +220,7 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
|
206
220
|
}
|
|
207
221
|
try {
|
|
208
222
|
await SecureStore.setItemAsync("AUTH_TOKEN", action.payload.token);
|
|
209
|
-
await SecureStore.setItemAsync("REFRESH_TOKEN", action.payload.refreshToken);
|
|
223
|
+
await SecureStore.setItemAsync("REFRESH_TOKEN", action.payload.refreshToken ?? "");
|
|
210
224
|
console.debug("Saved auth token to secure storage.");
|
|
211
225
|
} catch (error) {
|
|
212
226
|
console.error(`Error setting auth token: ${error}`);
|
|
@@ -223,7 +237,7 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
|
223
237
|
// Check if we're in a browser environment (not SSR)
|
|
224
238
|
if (typeof window !== "undefined") {
|
|
225
239
|
await AsyncStorage.setItem("AUTH_TOKEN", action.payload.token);
|
|
226
|
-
await AsyncStorage.setItem("REFRESH_TOKEN", action.payload.refreshToken);
|
|
240
|
+
await AsyncStorage.setItem("REFRESH_TOKEN", action.payload.refreshToken ?? "");
|
|
227
241
|
console.debug("Saved auth token to async storage.");
|
|
228
242
|
} else {
|
|
229
243
|
console.warn("Cannot store auth token: window is not defined (SSR context)");
|
|
@@ -233,7 +247,7 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
|
233
247
|
throw error;
|
|
234
248
|
}
|
|
235
249
|
}
|
|
236
|
-
listenerApi.dispatch(authSlice.actions.setUserId({userId: action.payload.userId}));
|
|
250
|
+
listenerApi.dispatch(authSlice.actions.setUserId({userId: action.payload.userId ?? ""}));
|
|
237
251
|
}
|
|
238
252
|
},
|
|
239
253
|
type: "terreno-rtk/executeMutation/fulfilled",
|
package/src/betterAuthSlice.ts
CHANGED
|
@@ -5,7 +5,12 @@
|
|
|
5
5
|
* login/logout actions, and selectors for auth state.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import {
|
|
8
|
+
import {
|
|
9
|
+
createListenerMiddleware,
|
|
10
|
+
createSlice,
|
|
11
|
+
type PayloadAction,
|
|
12
|
+
type UnknownAction,
|
|
13
|
+
} from "@reduxjs/toolkit";
|
|
9
14
|
import {DateTime} from "luxon";
|
|
10
15
|
|
|
11
16
|
import type {BetterAuthClientInterface, BetterAuthUser} from "./betterAuthTypes";
|
|
@@ -16,10 +21,13 @@ import type {BetterAuthClientInterface, BetterAuthUser} from "./betterAuthTypes"
|
|
|
16
21
|
const LOGOUT_ACTION_TYPE = "auth/logout";
|
|
17
22
|
|
|
18
23
|
/**
|
|
19
|
-
* Root state type -
|
|
24
|
+
* Root state type - only the betterAuth slice is known here; other slices are
|
|
25
|
+
* allowed via the index signature so this works with any Redux store configuration.
|
|
20
26
|
*/
|
|
21
|
-
|
|
22
|
-
|
|
27
|
+
interface RootState {
|
|
28
|
+
betterAuth?: BetterAuthState;
|
|
29
|
+
[key: string]: unknown;
|
|
30
|
+
}
|
|
23
31
|
|
|
24
32
|
/**
|
|
25
33
|
* Better Auth Redux state interface.
|
|
@@ -202,8 +210,7 @@ export const generateBetterAuthSlice = (config: GenerateBetterAuthSliceConfig) =
|
|
|
202
210
|
* Syncs the session state from Better Auth to Redux.
|
|
203
211
|
* Call this on app startup and periodically to keep state in sync.
|
|
204
212
|
*/
|
|
205
|
-
|
|
206
|
-
const syncSession = async (dispatch: any): Promise<void> => {
|
|
213
|
+
const syncSession = async (dispatch: (action: UnknownAction) => void): Promise<void> => {
|
|
207
214
|
dispatch(betterAuthSlice.actions.setLoading(true));
|
|
208
215
|
|
|
209
216
|
try {
|
|
@@ -269,40 +276,34 @@ export type BetterAuthSlice = ReturnType<typeof generateBetterAuthSlice>;
|
|
|
269
276
|
* Selects the entire Better Auth state.
|
|
270
277
|
*/
|
|
271
278
|
export const selectBetterAuthState = (state: RootState): BetterAuthState | undefined =>
|
|
272
|
-
|
|
273
|
-
(state as any).betterAuth;
|
|
279
|
+
state.betterAuth;
|
|
274
280
|
|
|
275
281
|
/**
|
|
276
282
|
* Selects whether the user is authenticated.
|
|
277
283
|
*/
|
|
278
284
|
export const selectBetterAuthIsAuthenticated = (state: RootState): boolean =>
|
|
279
|
-
|
|
280
|
-
(state as any).betterAuth?.isAuthenticated ?? false;
|
|
285
|
+
state.betterAuth?.isAuthenticated ?? false;
|
|
281
286
|
|
|
282
287
|
/**
|
|
283
288
|
* Selects the current user ID.
|
|
284
289
|
*/
|
|
285
290
|
export const selectBetterAuthUserId = (state: RootState): string | null =>
|
|
286
|
-
|
|
287
|
-
(state as any).betterAuth?.userId ?? null;
|
|
291
|
+
state.betterAuth?.userId ?? null;
|
|
288
292
|
|
|
289
293
|
/**
|
|
290
294
|
* Selects the current user data.
|
|
291
295
|
*/
|
|
292
296
|
export const selectBetterAuthUser = (state: RootState): BetterAuthUser | null =>
|
|
293
|
-
|
|
294
|
-
(state as any).betterAuth?.user ?? null;
|
|
297
|
+
state.betterAuth?.user ?? null;
|
|
295
298
|
|
|
296
299
|
/**
|
|
297
300
|
* Selects whether the auth state is loading.
|
|
298
301
|
*/
|
|
299
302
|
export const selectBetterAuthIsLoading = (state: RootState): boolean =>
|
|
300
|
-
|
|
301
|
-
(state as any).betterAuth?.isLoading ?? false;
|
|
303
|
+
state.betterAuth?.isLoading ?? false;
|
|
302
304
|
|
|
303
305
|
/**
|
|
304
306
|
* Selects the last error message.
|
|
305
307
|
*/
|
|
306
308
|
export const selectBetterAuthError = (state: RootState): string | null =>
|
|
307
|
-
|
|
308
|
-
(state as any).betterAuth?.error ?? null;
|
|
309
|
+
state.betterAuth?.error ?? null;
|
package/src/useFeatureFlags.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type {Api} from "@reduxjs/toolkit/query/react";
|
|
2
|
+
import {DateTime} from "luxon";
|
|
2
3
|
import {useCallback, useEffect, useMemo, useRef} from "react";
|
|
3
4
|
import {useTerrenoFeatureFlags} from "./useTerrenoFeatureFlags";
|
|
4
5
|
|
|
@@ -104,7 +105,7 @@ export const useFeatureFlags = (
|
|
|
104
105
|
return;
|
|
105
106
|
}
|
|
106
107
|
|
|
107
|
-
fetchStartedAtRef.current =
|
|
108
|
+
fetchStartedAtRef.current = DateTime.now().toMillis();
|
|
108
109
|
console.debug("[feature-flags] flagConfiguration request started", {
|
|
109
110
|
basePath,
|
|
110
111
|
});
|
|
@@ -115,7 +116,7 @@ export const useFeatureFlags = (
|
|
|
115
116
|
return;
|
|
116
117
|
}
|
|
117
118
|
|
|
118
|
-
const durationMs =
|
|
119
|
+
const durationMs = DateTime.now().toMillis() - fetchStartedAtRef.current;
|
|
119
120
|
fetchStartedAtRef.current = null;
|
|
120
121
|
console.debug("[feature-flags] flagConfiguration request failed", {
|
|
121
122
|
basePath,
|
|
@@ -142,7 +143,7 @@ export const useFeatureFlags = (
|
|
|
142
143
|
return;
|
|
143
144
|
}
|
|
144
145
|
|
|
145
|
-
const durationMs =
|
|
146
|
+
const durationMs = DateTime.now().toMillis() - fetchStartedAtRef.current;
|
|
146
147
|
fetchStartedAtRef.current = null;
|
|
147
148
|
console.debug("[feature-flags] flagConfiguration request completed", {
|
|
148
149
|
basePath,
|