@terreno/rtk 0.25.0 → 0.27.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/.ai/guidelines/core.md +2 -0
- package/dist/authSlice.d.ts.map +1 -1
- package/dist/authSlice.js +3 -1
- package/dist/authSlice.js.map +1 -1
- package/dist/authSlice.test.js +15 -8
- package/dist/authSlice.test.js.map +1 -1
- package/dist/authSliceNative.test.js +3 -16
- package/dist/authSliceNative.test.js.map +1 -1
- package/dist/betterAuthClient.d.ts.map +1 -1
- package/dist/betterAuthClient.js +0 -1
- package/dist/betterAuthClient.js.map +1 -1
- package/dist/betterAuthSlice.test.js +1 -0
- package/dist/betterAuthSlice.test.js.map +1 -1
- package/dist/constants.d.ts +7 -1
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js.map +1 -1
- package/dist/emptyApi.d.ts.map +1 -1
- package/dist/emptyApi.js +0 -2
- package/dist/emptyApi.js.map +1 -1
- package/dist/isolated/constants.isolated.d.ts +2 -0
- package/dist/isolated/constants.isolated.d.ts.map +1 -0
- package/dist/isolated/constants.isolated.js +81 -0
- package/dist/isolated/constants.isolated.js.map +1 -0
- package/dist/isolated/constants.test.js +53 -75
- package/dist/isolated/constants.test.js.map +1 -1
- package/dist/isolated/offlineMiddleware.isolated.js +0 -1
- package/dist/isolated/offlineMiddleware.isolated.js.map +1 -1
- package/dist/isolated/offlineMiddleware.native.isolated.js +0 -1
- package/dist/isolated/offlineMiddleware.native.isolated.js.map +1 -1
- package/dist/isolated/useUpgradeCheck.mobile.isolated.js +47 -0
- package/dist/isolated/useUpgradeCheck.mobile.isolated.js.map +1 -1
- package/dist/mongooseSlice.test.js +0 -1
- package/dist/mongooseSlice.test.js.map +1 -1
- package/dist/offlineGate.d.ts +1 -1
- package/dist/offlineGate.d.ts.map +1 -1
- package/dist/offlineGate.js +1 -3
- package/dist/offlineGate.js.map +1 -1
- package/dist/offlineMiddleware.d.ts.map +1 -1
- package/dist/offlineMiddleware.js +26 -0
- package/dist/offlineMiddleware.js.map +1 -1
- package/dist/offlineMiddleware.test.js +5 -1
- package/dist/offlineMiddleware.test.js.map +1 -1
- package/dist/realtime.test.js +1 -0
- package/dist/realtime.test.js.map +1 -1
- package/dist/sessionApi.test.d.ts +2 -0
- package/dist/sessionApi.test.d.ts.map +1 -0
- package/dist/sessionApi.test.js +84 -0
- package/dist/sessionApi.test.js.map +1 -0
- package/dist/sync.d.ts.map +1 -1
- package/dist/sync.js.map +1 -1
- package/dist/sync.test.d.ts +2 -0
- package/dist/sync.test.d.ts.map +1 -0
- package/dist/sync.test.js +296 -0
- package/dist/sync.test.js.map +1 -0
- package/dist/testPreload.test.js +6 -0
- package/dist/testPreload.test.js.map +1 -1
- package/dist/useFeatureFlags.d.ts.map +1 -1
- package/dist/useFeatureFlags.js.map +1 -1
- package/dist/useTerrenoFeatureFlags.d.ts.map +1 -1
- package/dist/useTerrenoFeatureFlags.js.map +1 -1
- package/dist/useTerrenoFeatureFlags.test.js +10 -0
- package/dist/useTerrenoFeatureFlags.test.js.map +1 -1
- package/dist/useUpgradeCheckNative.test.js +21 -0
- package/dist/useUpgradeCheckNative.test.js.map +1 -1
- package/package.json +2 -2
- package/src/authSlice.test.ts +25 -13
- package/src/authSlice.ts +3 -1
- package/src/authSliceNative.test.ts +4 -18
- package/src/betterAuthClient.ts +1 -2
- package/src/betterAuthSlice.test.ts +1 -0
- package/src/constants.ts +7 -2
- package/src/emptyApi.ts +5 -4
- package/src/isolated/constants.isolated.ts +118 -0
- package/src/isolated/constants.test.ts +81 -78
- package/src/isolated/offlineMiddleware.isolated.ts +1 -2
- package/src/isolated/offlineMiddleware.native.isolated.ts +1 -2
- package/src/isolated/useUpgradeCheck.mobile.isolated.ts +60 -0
- package/src/mongooseSlice.test.ts +1 -2
- package/src/offlineGate.ts +1 -2
- package/src/offlineMiddleware.test.ts +6 -1
- package/src/offlineMiddleware.ts +27 -0
- package/src/realtime.test.ts +1 -0
- package/src/sessionApi.test.ts +115 -0
- package/src/sync.test.ts +390 -0
- package/src/sync.ts +2 -1
- package/src/testPreload.test.ts +7 -0
- package/src/useFeatureFlags.ts +1 -0
- package/src/useTerrenoFeatureFlags.test.ts +16 -0
- package/src/useTerrenoFeatureFlags.ts +2 -0
- package/src/useUpgradeCheckNative.test.ts +26 -0
package/src/testPreload.test.ts
CHANGED
|
@@ -23,6 +23,13 @@ describe("test-preload default mocks", () => {
|
|
|
23
23
|
expect(state.isConnected).toBe(true);
|
|
24
24
|
});
|
|
25
25
|
|
|
26
|
+
it("expo-network mock exposes addNetworkStateListener", async () => {
|
|
27
|
+
const network = await import("expo-network");
|
|
28
|
+
const subscription = network.addNetworkStateListener(() => {});
|
|
29
|
+
expect(subscription.remove).toBeTypeOf("function");
|
|
30
|
+
subscription.remove();
|
|
31
|
+
});
|
|
32
|
+
|
|
26
33
|
it("expo-constants mock exposes an empty config", async () => {
|
|
27
34
|
const Constants = (await import("expo-constants")).default;
|
|
28
35
|
expect(Constants.expoConfig?.extra).toBeDefined();
|
package/src/useFeatureFlags.ts
CHANGED
|
@@ -7,6 +7,7 @@ interface FlagValues {
|
|
|
7
7
|
[key: string]: boolean | string | null;
|
|
8
8
|
}
|
|
9
9
|
|
|
10
|
+
// noExplicitAny: RTK Query API generic typing is intentionally flexible here.
|
|
10
11
|
// biome-ignore lint/suspicious/noExplicitAny: RTK Query API generic typing is intentionally flexible here.
|
|
11
12
|
type FlagsApi = Api<any, any, any, any>;
|
|
12
13
|
|
|
@@ -104,6 +104,22 @@ describe("useTerrenoFeatureFlags", () => {
|
|
|
104
104
|
expect(result.current.error).toBeDefined();
|
|
105
105
|
});
|
|
106
106
|
|
|
107
|
+
it("reports loading while the initial flag configuration query has no data yet", () => {
|
|
108
|
+
const {api} = buildApi({isLoading: true, isSuccess: false});
|
|
109
|
+
const {result} = renderHook(() =>
|
|
110
|
+
useTerrenoFeatureFlags(api as never, {domain: "feature-flags", userId: "u1"})
|
|
111
|
+
);
|
|
112
|
+
expect(result.current.isLoading).toBe(true);
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
it("reports loading while a refetch is in flight even after data has loaded", () => {
|
|
116
|
+
const {api} = buildApi({data: {alpha: boolDef("on")}, isFetching: true, isSuccess: true});
|
|
117
|
+
const {result} = renderHook(() =>
|
|
118
|
+
useTerrenoFeatureFlags(api as never, {domain: "feature-flags", userId: "u1"})
|
|
119
|
+
);
|
|
120
|
+
expect(result.current.isLoading).toBe(true);
|
|
121
|
+
});
|
|
122
|
+
|
|
107
123
|
it("isolates domains so a custom domain does not read another domain's provider", async () => {
|
|
108
124
|
const {api} = buildApi({data: {alpha: boolDef("on")}});
|
|
109
125
|
const {result} = renderHook(() =>
|
|
@@ -34,9 +34,11 @@ export interface UseTerrenoFeatureFlagsResult {
|
|
|
34
34
|
refetch: () => unknown;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
|
+
// noExplicitAny: RTK Query API generic typing is intentionally flexible here.
|
|
37
38
|
// biome-ignore lint/suspicious/noExplicitAny: RTK Query API generic typing is intentionally flexible here.
|
|
38
39
|
type FlagsApi = Api<any, any, any, any>;
|
|
39
40
|
|
|
41
|
+
// noExplicitAny: Endpoint hook is injected dynamically by RTK Query.
|
|
40
42
|
// biome-ignore lint/suspicious/noExplicitAny: Endpoint hook is injected dynamically by RTK Query.
|
|
41
43
|
type EnhancedTerrenoFlagsApi = FlagsApi & {useTerrenoFlagConfigurationQuery: any};
|
|
42
44
|
|
|
@@ -6,6 +6,7 @@ import React from "react";
|
|
|
6
6
|
import {Provider} from "react-redux";
|
|
7
7
|
|
|
8
8
|
const openedUrls: string[] = [];
|
|
9
|
+
let openUrlShouldReject = false;
|
|
9
10
|
|
|
10
11
|
// Keep this react-native mock a superset of the preload's mock so other test
|
|
11
12
|
// files still resolve AppState / Linking / Platform after this file runs.
|
|
@@ -16,6 +17,9 @@ mock.module("react-native", () => ({
|
|
|
16
17
|
},
|
|
17
18
|
Linking: {
|
|
18
19
|
openURL: async (url: string) => {
|
|
20
|
+
if (openUrlShouldReject) {
|
|
21
|
+
throw new Error("openURL failed");
|
|
22
|
+
}
|
|
19
23
|
openedUrls.push(url);
|
|
20
24
|
return true;
|
|
21
25
|
},
|
|
@@ -74,6 +78,7 @@ describe("useUpgradeCheck (native)", () => {
|
|
|
74
78
|
beforeEach(() => {
|
|
75
79
|
originalFetch = globalThis.fetch;
|
|
76
80
|
openedUrls.length = 0;
|
|
81
|
+
openUrlShouldReject = false;
|
|
77
82
|
constantsWithExtra.expoConfig.extra.buildNumber = 100;
|
|
78
83
|
});
|
|
79
84
|
|
|
@@ -103,6 +108,27 @@ describe("useUpgradeCheck (native)", () => {
|
|
|
103
108
|
unmount();
|
|
104
109
|
});
|
|
105
110
|
|
|
111
|
+
it("swallows errors when opening the update URL fails on native", async () => {
|
|
112
|
+
mockFetchWith({status: "required", updateUrl: "https://example.com/app-update"});
|
|
113
|
+
openUrlShouldReject = true;
|
|
114
|
+
|
|
115
|
+
const {result, unmount} = renderHook(() => useUpgradeCheck(), {
|
|
116
|
+
wrapper: createWrapper(createTestStore()),
|
|
117
|
+
});
|
|
118
|
+
await flush();
|
|
119
|
+
|
|
120
|
+
expect(result.current.canUpdate).toBe(true);
|
|
121
|
+
|
|
122
|
+
await act(async () => {
|
|
123
|
+
result.current.onUpdate();
|
|
124
|
+
await new Promise((resolve) => setTimeout(resolve, 10));
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// The rejection is caught internally; no URL is recorded and nothing throws.
|
|
128
|
+
expect(openedUrls).toEqual([]);
|
|
129
|
+
unmount();
|
|
130
|
+
});
|
|
131
|
+
|
|
106
132
|
it("does not open a URL on native when no update URL is available", async () => {
|
|
107
133
|
mockFetchWith({status: "required"});
|
|
108
134
|
|