@terreno/rtk 0.10.0 → 0.11.1
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.test.js +68 -0
- package/dist/authSlice.test.js.map +1 -1
- package/dist/authSliceNative.test.d.ts +2 -0
- package/dist/authSliceNative.test.d.ts.map +1 -0
- package/dist/authSliceNative.test.js +167 -0
- package/dist/authSliceNative.test.js.map +1 -0
- package/dist/betterAuthClient.d.ts +16 -0
- package/dist/betterAuthClient.d.ts.map +1 -1
- package/dist/betterAuthClient.js +5 -2
- package/dist/betterAuthClient.js.map +1 -1
- package/dist/betterAuthClient.test.d.ts +2 -0
- package/dist/betterAuthClient.test.d.ts.map +1 -0
- package/dist/betterAuthClient.test.js +151 -0
- package/dist/betterAuthClient.test.js.map +1 -0
- package/dist/betterAuthSlice.test.js +54 -1
- package/dist/betterAuthSlice.test.js.map +1 -1
- package/dist/buildNumber.test.d.ts +2 -0
- package/dist/buildNumber.test.d.ts.map +1 -0
- package/dist/buildNumber.test.js +95 -0
- package/dist/buildNumber.test.js.map +1 -0
- package/dist/constants.d.ts +27 -3
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +45 -56
- package/dist/constants.js.map +1 -1
- package/dist/constants.test.js +174 -123
- package/dist/constants.test.js.map +1 -1
- package/dist/isolated/useUpgradeCheck.isolated.d.ts +2 -0
- package/dist/isolated/useUpgradeCheck.isolated.d.ts.map +1 -0
- package/dist/isolated/useUpgradeCheck.isolated.js +135 -0
- package/dist/isolated/useUpgradeCheck.isolated.js.map +1 -0
- package/dist/mongooseSlice.test.d.ts +2 -0
- package/dist/mongooseSlice.test.d.ts.map +1 -0
- package/dist/mongooseSlice.test.js +39 -0
- package/dist/mongooseSlice.test.js.map +1 -0
- package/dist/tagGenerator.test.d.ts +2 -0
- package/dist/tagGenerator.test.d.ts.map +1 -0
- package/dist/tagGenerator.test.js +96 -0
- package/dist/tagGenerator.test.js.map +1 -0
- package/dist/testPreload.test.d.ts +2 -0
- package/dist/testPreload.test.d.ts.map +1 -0
- package/dist/testPreload.test.js +27 -0
- package/dist/testPreload.test.js.map +1 -0
- package/dist/useFeatureFlags.d.ts +25 -1
- package/dist/useFeatureFlags.d.ts.map +1 -1
- package/dist/useFeatureFlags.js +18 -16
- package/dist/useFeatureFlags.js.map +1 -1
- package/dist/useFeatureFlags.test.d.ts +2 -0
- package/dist/useFeatureFlags.test.d.ts.map +1 -0
- package/dist/useFeatureFlags.test.js +162 -0
- package/dist/useFeatureFlags.test.js.map +1 -0
- package/dist/useUpgradeCheck.d.ts +2 -0
- package/dist/useUpgradeCheck.d.ts.map +1 -1
- package/dist/useUpgradeCheck.js +39 -46
- package/dist/useUpgradeCheck.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 +326 -0
- package/dist/useUpgradeCheck.test.js.map +1 -0
- package/package.json +6 -3
- package/src/authSlice.test.ts +79 -0
- package/src/authSliceNative.test.ts +187 -0
- package/src/betterAuthClient.test.ts +176 -0
- package/src/betterAuthClient.ts +6 -3
- package/src/betterAuthSlice.test.ts +67 -0
- package/src/buildNumber.test.ts +120 -0
- package/src/constants.test.ts +193 -154
- package/src/constants.ts +72 -70
- package/src/isolated/useUpgradeCheck.isolated.ts +175 -0
- package/src/mongooseSlice.test.ts +46 -0
- package/src/tagGenerator.test.ts +109 -0
- package/src/testPreload.test.ts +30 -0
- package/src/useFeatureFlags.test.ts +209 -0
- package/src/useFeatureFlags.ts +44 -5
- package/src/useUpgradeCheck.test.ts +408 -0
- package/src/useUpgradeCheck.ts +41 -48
- package/dist/test-preload.d.ts +0 -2
- package/dist/test-preload.d.ts.map +0 -1
- package/dist/test-preload.js +0 -24
- package/dist/test-preload.js.map +0 -1
- package/src/test-preload.ts +0 -28
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import { generateTags } from "./tagGenerator";
|
|
3
|
+
describe("generateTags", () => {
|
|
4
|
+
const tagTypes = ["users", "posts", "conversations", "messages"];
|
|
5
|
+
it("assigns invalidatesTags for getConversations endpoint", () => {
|
|
6
|
+
const api = {
|
|
7
|
+
endpoints: {
|
|
8
|
+
getConversations: {},
|
|
9
|
+
},
|
|
10
|
+
};
|
|
11
|
+
const tags = generateTags(api, tagTypes);
|
|
12
|
+
// getConversations matches both the special case AND the list-endpoint branch,
|
|
13
|
+
// so the list-endpoint branch wins as the final assignment. The special case
|
|
14
|
+
// still executes for coverage, but the final value is the list providesTags.
|
|
15
|
+
expect(tags.getConversations).toBeDefined();
|
|
16
|
+
expect(typeof tags.getConversations.providesTags).toBe("function");
|
|
17
|
+
});
|
|
18
|
+
it("assigns providesTags on list get endpoints", () => {
|
|
19
|
+
const api = {
|
|
20
|
+
endpoints: {
|
|
21
|
+
getUsers: {},
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
const tags = generateTags(api, tagTypes);
|
|
25
|
+
expect(typeof tags.getUsers.providesTags).toBe("function");
|
|
26
|
+
// Exercise the returned provides function with and without data
|
|
27
|
+
const providesFn = tags.getUsers.providesTags;
|
|
28
|
+
expect(providesFn(null)).toEqual(["users"]);
|
|
29
|
+
expect(providesFn({ data: [{ _id: "1" }, { _id: "2" }] })).toEqual([
|
|
30
|
+
{ id: "1", type: "users" },
|
|
31
|
+
{ id: "2", type: "users" },
|
|
32
|
+
"users",
|
|
33
|
+
]);
|
|
34
|
+
expect(providesFn({})).toEqual(["users"]);
|
|
35
|
+
});
|
|
36
|
+
it("assigns providesTags on read (ById) get endpoints", () => {
|
|
37
|
+
const api = {
|
|
38
|
+
endpoints: {
|
|
39
|
+
getUserById: {},
|
|
40
|
+
},
|
|
41
|
+
};
|
|
42
|
+
const tags = generateTags(api, tagTypes);
|
|
43
|
+
expect(typeof tags.getUserById.providesTags).toBe("function");
|
|
44
|
+
const providesFn = tags.getUserById.providesTags;
|
|
45
|
+
expect(providesFn(null)).toEqual(["users"]);
|
|
46
|
+
expect(providesFn({ _id: "abc" })).toEqual([{ id: "abc", type: "users" }]);
|
|
47
|
+
});
|
|
48
|
+
it("assigns invalidatesTags on patch endpoints", () => {
|
|
49
|
+
const api = {
|
|
50
|
+
endpoints: {
|
|
51
|
+
patchUserById: {},
|
|
52
|
+
},
|
|
53
|
+
};
|
|
54
|
+
const tags = generateTags(api, tagTypes);
|
|
55
|
+
expect(typeof tags.patchUserById.invalidatesTags).toBe("function");
|
|
56
|
+
const invalidateFn = tags.patchUserById.invalidatesTags;
|
|
57
|
+
expect(invalidateFn(null)).toEqual(["users"]);
|
|
58
|
+
expect(invalidateFn({ data: [{ _id: "x" }] })).toEqual([{ id: "x", type: "users" }, "users"]);
|
|
59
|
+
});
|
|
60
|
+
it("assigns invalidatesTags on delete endpoints", () => {
|
|
61
|
+
const api = {
|
|
62
|
+
endpoints: {
|
|
63
|
+
deletePostById: {},
|
|
64
|
+
},
|
|
65
|
+
};
|
|
66
|
+
const tags = generateTags(api, tagTypes);
|
|
67
|
+
expect(typeof tags.deletePostById.invalidatesTags).toBe("function");
|
|
68
|
+
const invalidateFn = tags.deletePostById.invalidatesTags;
|
|
69
|
+
expect(invalidateFn(null)).toEqual(["posts"]);
|
|
70
|
+
});
|
|
71
|
+
it("skips endpoints with no matching tag", () => {
|
|
72
|
+
const api = {
|
|
73
|
+
endpoints: {
|
|
74
|
+
getUnknownThing: {},
|
|
75
|
+
patchOrphan: {},
|
|
76
|
+
},
|
|
77
|
+
};
|
|
78
|
+
const tags = generateTags(api, tagTypes);
|
|
79
|
+
expect(tags.getUnknownThing).toBeUndefined();
|
|
80
|
+
expect(tags.patchOrphan).toBeUndefined();
|
|
81
|
+
});
|
|
82
|
+
it("returns an empty object for an empty endpoint list", () => {
|
|
83
|
+
const tags = generateTags({ endpoints: {} }, tagTypes);
|
|
84
|
+
expect(tags).toEqual({});
|
|
85
|
+
});
|
|
86
|
+
it("ignores endpoints that are not get/patch/delete", () => {
|
|
87
|
+
const api = {
|
|
88
|
+
endpoints: {
|
|
89
|
+
postUser: {},
|
|
90
|
+
},
|
|
91
|
+
};
|
|
92
|
+
const tags = generateTags(api, tagTypes);
|
|
93
|
+
expect(tags.postUser).toBeUndefined();
|
|
94
|
+
});
|
|
95
|
+
});
|
|
96
|
+
//# sourceMappingURL=tagGenerator.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tagGenerator.test.js","sourceRoot":"","sources":["../src/tagGenerator.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testPreload.test.d.ts","sourceRoot":"","sources":["../src/testPreload.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
// Invoke the mocked module factories registered in test-preload.ts so
|
|
3
|
+
// their bodies (and returned functions) are recognised as covered.
|
|
4
|
+
describe("test-preload default mocks", () => {
|
|
5
|
+
it("expo-secure-store mock returns a no-op store", async () => {
|
|
6
|
+
const SecureStore = await import("expo-secure-store");
|
|
7
|
+
await SecureStore.setItemAsync("k", "v");
|
|
8
|
+
await SecureStore.deleteItemAsync("k");
|
|
9
|
+
expect(await SecureStore.getItemAsync("k")).toBeNull();
|
|
10
|
+
});
|
|
11
|
+
it("AsyncStorage mock returns a no-op store", async () => {
|
|
12
|
+
const AsyncStorage = (await import("@react-native-async-storage/async-storage")).default;
|
|
13
|
+
await AsyncStorage.setItem("k", "v");
|
|
14
|
+
await AsyncStorage.removeItem("k");
|
|
15
|
+
expect(await AsyncStorage.getItem("k")).toBeNull();
|
|
16
|
+
});
|
|
17
|
+
it("expo-network mock reports a connected network", async () => {
|
|
18
|
+
const network = await import("expo-network");
|
|
19
|
+
const state = await network.getNetworkStateAsync();
|
|
20
|
+
expect(state.isConnected).toBe(true);
|
|
21
|
+
});
|
|
22
|
+
it("expo-constants mock exposes an empty config", async () => {
|
|
23
|
+
const Constants = (await import("expo-constants")).default;
|
|
24
|
+
expect(Constants.expoConfig?.extra).toBeDefined();
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
//# sourceMappingURL=testPreload.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"testPreload.test.js","sourceRoot":"","sources":["../src/testPreload.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAC,MAAM,UAAU,CAAC;AAE9C,sEAAsE;AACtE,mEAAmE;AACnE,QAAQ,CAAC,4BAA4B,EAAE,GAAG,EAAE;IAC1C,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;QAC5D,MAAM,WAAW,GAAG,MAAM,MAAM,CAAC,mBAAmB,CAAC,CAAC;QACtD,MAAM,WAAW,CAAC,YAAY,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,WAAW,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QACvC,MAAM,CAAC,MAAM,WAAW,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACzD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,MAAM,YAAY,GAAG,CAAC,MAAM,MAAM,CAAC,2CAA2C,CAAC,CAAC,CAAC,OAAO,CAAC;QACzF,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACrC,MAAM,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;QACnC,MAAM,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;IACrD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,oBAAoB,EAAE,CAAC;QACnD,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;QAC3D,MAAM,SAAS,GAAG,CAAC,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,CAAC,OAAO,CAAC;QAC3D,MAAM,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -23,6 +23,30 @@ interface UseFeatureFlagsResult {
|
|
|
23
23
|
* const variant = getVariant("checkout-experiment"); // "control" | "variant-a" | null
|
|
24
24
|
* ```
|
|
25
25
|
*/
|
|
26
|
-
export
|
|
26
|
+
export interface UseFeatureFlagsOptions {
|
|
27
|
+
/**
|
|
28
|
+
* Base path for the feature-flags endpoint. Defaults to "/feature-flags".
|
|
29
|
+
*/
|
|
30
|
+
basePath?: string;
|
|
31
|
+
/**
|
|
32
|
+
* When true, the underlying evaluate query is not fired. Use this to avoid
|
|
33
|
+
* fetching before the user is authenticated.
|
|
34
|
+
*/
|
|
35
|
+
skip?: boolean;
|
|
36
|
+
}
|
|
37
|
+
interface ResolvedFeatureFlagsOptions {
|
|
38
|
+
basePath: string;
|
|
39
|
+
skip: boolean;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Normalizes the legacy-compatible `basePathOrOptions` argument into a
|
|
43
|
+
* `{basePath, skip}` pair with defaults applied.
|
|
44
|
+
*
|
|
45
|
+
* - `undefined` -> `{basePath: "/feature-flags", skip: false}`
|
|
46
|
+
* - `string` -> `{basePath: <string>, skip: false}` (legacy form)
|
|
47
|
+
* - `object` -> `{basePath: opts.basePath ?? "/feature-flags", skip: opts.skip ?? false}`
|
|
48
|
+
*/
|
|
49
|
+
export declare const resolveFeatureFlagsOptions: (basePathOrOptions?: string | UseFeatureFlagsOptions) => ResolvedFeatureFlagsOptions;
|
|
50
|
+
export declare function useFeatureFlags(api: Api<any, any, any, any>, basePathOrOptions?: string | UseFeatureFlagsOptions): UseFeatureFlagsResult;
|
|
27
51
|
export {};
|
|
28
52
|
//# sourceMappingURL=useFeatureFlags.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeatureFlags.d.ts","sourceRoot":"","sources":["../src/useFeatureFlags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,8BAA8B,CAAC;AAGtD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;AAE1D,UAAU,qBAAqB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,
|
|
1
|
+
{"version":3,"file":"useFeatureFlags.d.ts","sourceRoot":"","sources":["../src/useFeatureFlags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,8BAA8B,CAAC;AAGtD,KAAK,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC,CAAC;AAE1D,UAAU,qBAAqB;IAC7B,KAAK,EAAE,UAAU,CAAC;IAClB,OAAO,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;IAClC,UAAU,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IAC3C,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,sBAAsB;IACrC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,UAAU,2BAA2B;IACnC,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,OAAO,CAAC;CACf;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,0BAA0B,GACrC,oBAAoB,MAAM,GAAG,sBAAsB,KAClD,2BAMF,CAAC;AAIF,wBAAgB,eAAe,CAE7B,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,EAC5B,iBAAiB,CAAC,EAAE,MAAM,GAAG,sBAAsB,GAClD,qBAAqB,CAyFvB"}
|
package/dist/useFeatureFlags.js
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
import { useCallback, useEffect, useMemo, useRef } from "react";
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* Normalizes the legacy-compatible `basePathOrOptions` argument into a
|
|
4
|
+
* `{basePath, skip}` pair with defaults applied.
|
|
4
5
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
* @example
|
|
10
|
-
* ```typescript
|
|
11
|
-
* const { getFlag, getVariant } = useFeatureFlags(terrenoApi);
|
|
12
|
-
*
|
|
13
|
-
* const showNewCheckout = getFlag("new-checkout-flow"); // true | false
|
|
14
|
-
* const variant = getVariant("checkout-experiment"); // "control" | "variant-a" | null
|
|
15
|
-
* ```
|
|
6
|
+
* - `undefined` -> `{basePath: "/feature-flags", skip: false}`
|
|
7
|
+
* - `string` -> `{basePath: <string>, skip: false}` (legacy form)
|
|
8
|
+
* - `object` -> `{basePath: opts.basePath ?? "/feature-flags", skip: opts.skip ?? false}`
|
|
16
9
|
*/
|
|
17
|
-
export const
|
|
10
|
+
export const resolveFeatureFlagsOptions = (basePathOrOptions) => {
|
|
11
|
+
const { basePath = "/feature-flags", skip = false } = typeof basePathOrOptions === "string"
|
|
12
|
+
? { basePath: basePathOrOptions, skip: false }
|
|
13
|
+
: (basePathOrOptions ?? {});
|
|
14
|
+
return { basePath, skip };
|
|
15
|
+
};
|
|
16
|
+
// Overloaded signature preserves backwards compatibility with callers that
|
|
17
|
+
// pass a string basePath as the second argument.
|
|
18
|
+
export function useFeatureFlags(
|
|
18
19
|
// biome-ignore lint/suspicious/noExplicitAny: RTK Query API generic typing is intentionally flexible here.
|
|
19
|
-
api,
|
|
20
|
+
api, basePathOrOptions) {
|
|
21
|
+
const { basePath, skip } = resolveFeatureFlagsOptions(basePathOrOptions);
|
|
20
22
|
const enhancedApi = useMemo(() => api.injectEndpoints({
|
|
21
23
|
endpoints: (builder) => ({
|
|
22
24
|
evaluateFeatureFlags: builder.query({
|
|
@@ -30,7 +32,7 @@ api, basePath = "/feature-flags") => {
|
|
|
30
32
|
}), [api, basePath]);
|
|
31
33
|
// biome-ignore lint/suspicious/noExplicitAny: Endpoint hook is injected dynamically by RTK Query.
|
|
32
34
|
const useEvaluateQuery = enhancedApi.useEvaluateFeatureFlagsQuery;
|
|
33
|
-
const { data, isLoading, error, refetch } = useEvaluateQuery();
|
|
35
|
+
const { data, isLoading, error, refetch } = useEvaluateQuery(undefined, { skip });
|
|
34
36
|
const evaluateStartedAtRef = useRef(null);
|
|
35
37
|
const flags = data ?? {};
|
|
36
38
|
// Log when evaluate request enters loading state so client timing can be measured.
|
|
@@ -82,5 +84,5 @@ api, basePath = "/feature-flags") => {
|
|
|
82
84
|
return null;
|
|
83
85
|
}, [flags]);
|
|
84
86
|
return { error, flags, getFlag, getVariant, isLoading, refetch };
|
|
85
|
-
}
|
|
87
|
+
}
|
|
86
88
|
//# sourceMappingURL=useFeatureFlags.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeatureFlags.js","sourceRoot":"","sources":["../src/useFeatureFlags.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAC,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"useFeatureFlags.js","sourceRoot":"","sources":["../src/useFeatureFlags.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFeatureFlags.test.d.ts","sourceRoot":"","sources":["../src/useFeatureFlags.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
|
|
2
|
+
import { renderHook } from "@testing-library/react-native";
|
|
3
|
+
import { resolveFeatureFlagsOptions, useFeatureFlags } from "./useFeatureFlags";
|
|
4
|
+
describe("resolveFeatureFlagsOptions", () => {
|
|
5
|
+
it("applies defaults when no argument is provided", () => {
|
|
6
|
+
expect(resolveFeatureFlagsOptions()).toEqual({
|
|
7
|
+
basePath: "/feature-flags",
|
|
8
|
+
skip: false,
|
|
9
|
+
});
|
|
10
|
+
});
|
|
11
|
+
it("applies defaults when an empty options object is provided", () => {
|
|
12
|
+
expect(resolveFeatureFlagsOptions({})).toEqual({
|
|
13
|
+
basePath: "/feature-flags",
|
|
14
|
+
skip: false,
|
|
15
|
+
});
|
|
16
|
+
});
|
|
17
|
+
it("treats a string argument as a legacy basePath with skip=false", () => {
|
|
18
|
+
expect(resolveFeatureFlagsOptions("/custom-path")).toEqual({
|
|
19
|
+
basePath: "/custom-path",
|
|
20
|
+
skip: false,
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
it("preserves an empty string basePath when passed as a legacy string argument", () => {
|
|
24
|
+
expect(resolveFeatureFlagsOptions("")).toEqual({
|
|
25
|
+
basePath: "",
|
|
26
|
+
skip: false,
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
it("uses options.basePath when provided", () => {
|
|
30
|
+
expect(resolveFeatureFlagsOptions({ basePath: "/flags" })).toEqual({
|
|
31
|
+
basePath: "/flags",
|
|
32
|
+
skip: false,
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
it("uses options.skip when provided", () => {
|
|
36
|
+
expect(resolveFeatureFlagsOptions({ skip: true })).toEqual({
|
|
37
|
+
basePath: "/feature-flags",
|
|
38
|
+
skip: true,
|
|
39
|
+
});
|
|
40
|
+
});
|
|
41
|
+
it("uses both options.basePath and options.skip when provided together", () => {
|
|
42
|
+
expect(resolveFeatureFlagsOptions({ basePath: "/flags", skip: true })).toEqual({
|
|
43
|
+
basePath: "/flags",
|
|
44
|
+
skip: true,
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
it("does not let a legacy string basePath override skip to true", () => {
|
|
48
|
+
expect(resolveFeatureFlagsOptions("/custom-path").skip).toBe(false);
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
const buildApi = (queryResult) => {
|
|
52
|
+
const refetch = mock(() => { });
|
|
53
|
+
const capturedQueryBuilder = [];
|
|
54
|
+
const useEvaluateFeatureFlagsQuery = mock(() => ({
|
|
55
|
+
data: queryResult.data,
|
|
56
|
+
error: queryResult.error,
|
|
57
|
+
isLoading: queryResult.isLoading ?? false,
|
|
58
|
+
refetch,
|
|
59
|
+
}));
|
|
60
|
+
const api = {
|
|
61
|
+
injectEndpoints: mock((opts) => {
|
|
62
|
+
const builder = {
|
|
63
|
+
query: (def) => {
|
|
64
|
+
capturedQueryBuilder.push(def.query());
|
|
65
|
+
return { useQuery: useEvaluateFeatureFlagsQuery };
|
|
66
|
+
},
|
|
67
|
+
};
|
|
68
|
+
opts.endpoints(builder);
|
|
69
|
+
return { useEvaluateFeatureFlagsQuery };
|
|
70
|
+
}),
|
|
71
|
+
};
|
|
72
|
+
return { api, capturedQueryBuilder, refetch, useEvaluateFeatureFlagsQuery };
|
|
73
|
+
};
|
|
74
|
+
describe("useFeatureFlags hook", () => {
|
|
75
|
+
const debugCalls = [];
|
|
76
|
+
const originalDebug = console.debug;
|
|
77
|
+
beforeEach(() => {
|
|
78
|
+
debugCalls.length = 0;
|
|
79
|
+
console.debug = (...args) => {
|
|
80
|
+
debugCalls.push(args);
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
afterEach(() => {
|
|
84
|
+
console.debug = originalDebug;
|
|
85
|
+
});
|
|
86
|
+
it("builds the evaluate endpoint with the default basePath", () => {
|
|
87
|
+
const { api, capturedQueryBuilder } = buildApi({ data: { foo: true } });
|
|
88
|
+
renderHook(() => useFeatureFlags(api));
|
|
89
|
+
expect(capturedQueryBuilder[0]).toEqual({
|
|
90
|
+
method: "GET",
|
|
91
|
+
url: "/feature-flags/evaluate",
|
|
92
|
+
});
|
|
93
|
+
});
|
|
94
|
+
it("builds the evaluate endpoint with a custom basePath from legacy string argument", () => {
|
|
95
|
+
const { api, capturedQueryBuilder } = buildApi({ data: { foo: true } });
|
|
96
|
+
renderHook(() => useFeatureFlags(api, "/flags"));
|
|
97
|
+
expect(capturedQueryBuilder[0]).toEqual({ method: "GET", url: "/flags/evaluate" });
|
|
98
|
+
});
|
|
99
|
+
it("returns flag accessors that read boolean and string values", () => {
|
|
100
|
+
const { api } = buildApi({
|
|
101
|
+
data: { booleanOff: false, booleanOn: true, variantFlag: "variant-a" },
|
|
102
|
+
});
|
|
103
|
+
const { result } = renderHook(() => useFeatureFlags(api));
|
|
104
|
+
expect(result.current.getFlag("booleanOn")).toBe(true);
|
|
105
|
+
expect(result.current.getFlag("booleanOff")).toBe(false);
|
|
106
|
+
expect(result.current.getFlag("variantFlag")).toBe(false);
|
|
107
|
+
expect(result.current.getVariant("variantFlag")).toBe("variant-a");
|
|
108
|
+
expect(result.current.getVariant("booleanOn")).toBeNull();
|
|
109
|
+
expect(result.current.getVariant("missing")).toBeNull();
|
|
110
|
+
});
|
|
111
|
+
it("returns an empty flags map when no data is available", () => {
|
|
112
|
+
const { api } = buildApi({ isLoading: true });
|
|
113
|
+
const { result } = renderHook(() => useFeatureFlags(api));
|
|
114
|
+
expect(result.current.flags).toEqual({});
|
|
115
|
+
expect(result.current.isLoading).toBe(true);
|
|
116
|
+
});
|
|
117
|
+
it("exposes refetch from the underlying query hook", () => {
|
|
118
|
+
const { api, refetch } = buildApi({ data: { foo: true } });
|
|
119
|
+
const { result } = renderHook(() => useFeatureFlags(api));
|
|
120
|
+
result.current.refetch();
|
|
121
|
+
expect(refetch).toHaveBeenCalled();
|
|
122
|
+
});
|
|
123
|
+
it("logs evaluate request started when loading begins without prior data", () => {
|
|
124
|
+
const { api } = buildApi({ isLoading: true });
|
|
125
|
+
renderHook(() => useFeatureFlags(api));
|
|
126
|
+
const started = debugCalls.find((args) => args[0] === "[feature-flags] evaluate request started");
|
|
127
|
+
expect(started).toBeDefined();
|
|
128
|
+
});
|
|
129
|
+
it("logs evaluate request completed when data resolves after a loading phase", () => {
|
|
130
|
+
const api = buildApi({ isLoading: true });
|
|
131
|
+
const { rerender } = renderHook(({ queryResult }) => {
|
|
132
|
+
api.useEvaluateFeatureFlagsQuery.mockImplementationOnce(() => ({
|
|
133
|
+
data: queryResult.data,
|
|
134
|
+
error: queryResult.error,
|
|
135
|
+
isLoading: queryResult.isLoading ?? false,
|
|
136
|
+
refetch: api.refetch,
|
|
137
|
+
}));
|
|
138
|
+
return useFeatureFlags(api.api);
|
|
139
|
+
}, { initialProps: { queryResult: { isLoading: true } } });
|
|
140
|
+
rerender({ queryResult: { data: { alpha: true }, isLoading: false } });
|
|
141
|
+
const completed = debugCalls.find((args) => args[0] === "[feature-flags] evaluate request completed");
|
|
142
|
+
const started = debugCalls.find((args) => args[0] === "[feature-flags] evaluate request started");
|
|
143
|
+
expect(started).toBeDefined();
|
|
144
|
+
expect(completed).toBeDefined();
|
|
145
|
+
});
|
|
146
|
+
it("logs evaluate request failed when error is returned after loading", () => {
|
|
147
|
+
const api = buildApi({ isLoading: true });
|
|
148
|
+
const { rerender } = renderHook(({ queryResult }) => {
|
|
149
|
+
api.useEvaluateFeatureFlagsQuery.mockImplementationOnce(() => ({
|
|
150
|
+
data: queryResult.data,
|
|
151
|
+
error: queryResult.error,
|
|
152
|
+
isLoading: queryResult.isLoading ?? false,
|
|
153
|
+
refetch: api.refetch,
|
|
154
|
+
}));
|
|
155
|
+
return useFeatureFlags(api.api);
|
|
156
|
+
}, { initialProps: { queryResult: { isLoading: true } } });
|
|
157
|
+
rerender({ queryResult: { error: new Error("boom"), isLoading: false } });
|
|
158
|
+
const failed = debugCalls.find((args) => args[0] === "[feature-flags] evaluate request failed");
|
|
159
|
+
expect(failed).toBeDefined();
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
//# sourceMappingURL=useFeatureFlags.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFeatureFlags.test.js","sourceRoot":"","sources":["../src/useFeatureFlags.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -16,6 +16,8 @@ interface UseUpgradeCheckResult {
|
|
|
16
16
|
isWarning: boolean;
|
|
17
17
|
requiredMessage?: string;
|
|
18
18
|
warningMessage?: string;
|
|
19
|
+
/** Increments each time a poll returns "warning" status. Useful as a React key to force remount. */
|
|
20
|
+
warningCheckCount: number;
|
|
19
21
|
onUpdate: () => void;
|
|
20
22
|
}
|
|
21
23
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpgradeCheck.d.ts","sourceRoot":"","sources":["../src/useUpgradeCheck.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"useUpgradeCheck.d.ts","sourceRoot":"","sources":["../src/useUpgradeCheck.ts"],"names":[],"mappings":"AAOA,UAAU,sBAAsB;IAC9B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;OAGG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,qBAAqB;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,OAAO,CAAC;IACpB,SAAS,EAAE,OAAO,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,oGAAoG;IACpG,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB;AAED;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,eAAe,GAAI,UAAU,sBAAsB,KAAG,qBA0GlE,CAAC"}
|
package/dist/useUpgradeCheck.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { useToast } from "@terreno/ui";
|
|
2
1
|
import Constants from "expo-constants";
|
|
3
2
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
4
3
|
import { AppState, Linking } from "react-native";
|
|
@@ -26,16 +25,43 @@ export const useUpgradeCheck = (options) => {
|
|
|
26
25
|
const [requiredMessage, setRequiredMessage] = useState();
|
|
27
26
|
const [warningMessage, setWarningMessage] = useState();
|
|
28
27
|
const [updateUrl, setUpdateUrl] = useState();
|
|
29
|
-
const
|
|
30
|
-
const [triggerVersionCheck
|
|
28
|
+
const [warningCheckCount, setWarningCheckCount] = useState(0);
|
|
29
|
+
const [triggerVersionCheck] = useLazyGetVersionCheckQuery();
|
|
31
30
|
const buildNumber = Constants.expoConfig?.extra?.buildNumber;
|
|
32
31
|
const appState = useRef(AppState.currentState);
|
|
32
|
+
// Process version-check response inline via .unwrap() so every poll trigger
|
|
33
|
+
// is handled, even when RTK Query returns a structurally-shared cached response
|
|
34
|
+
// (which would prevent a useEffect from re-firing).
|
|
33
35
|
const runCheck = useCallback(() => {
|
|
34
36
|
if (buildNumber === undefined || buildNumber === null) {
|
|
35
37
|
return;
|
|
36
38
|
}
|
|
37
39
|
const platform = IsWeb ? "web" : "mobile";
|
|
38
|
-
|
|
40
|
+
triggerVersionCheck({ platform, version: buildNumber })
|
|
41
|
+
.unwrap()
|
|
42
|
+
.then((data) => {
|
|
43
|
+
const { message, status, updateUrl: responseUpdateUrl } = data;
|
|
44
|
+
if (status === "required") {
|
|
45
|
+
setIsRequired(true);
|
|
46
|
+
setRequiredMessage(message);
|
|
47
|
+
setIsWarning(false);
|
|
48
|
+
}
|
|
49
|
+
else if (status === "warning") {
|
|
50
|
+
setIsWarning(true);
|
|
51
|
+
setWarningMessage(message);
|
|
52
|
+
setWarningCheckCount((c) => c + 1);
|
|
53
|
+
}
|
|
54
|
+
else {
|
|
55
|
+
setIsWarning(false);
|
|
56
|
+
setIsRequired(false);
|
|
57
|
+
}
|
|
58
|
+
if (responseUpdateUrl) {
|
|
59
|
+
setUpdateUrl(responseUpdateUrl);
|
|
60
|
+
}
|
|
61
|
+
})
|
|
62
|
+
.catch((error) => {
|
|
63
|
+
console.debug("Version check failed, continuing normally", error);
|
|
64
|
+
});
|
|
39
65
|
}, [buildNumber, triggerVersionCheck]);
|
|
40
66
|
const onUpdate = useCallback(() => {
|
|
41
67
|
if (IsWeb) {
|
|
@@ -78,48 +104,15 @@ export const useUpgradeCheck = (options) => {
|
|
|
78
104
|
});
|
|
79
105
|
return () => subscription.remove();
|
|
80
106
|
}, [runCheck, recheckOnForeground]);
|
|
81
|
-
// Show warning toast in a separate effect. ToastProvider initializes its ref
|
|
82
|
-
// in useEffect, so we may need to retry when toast becomes available.
|
|
83
|
-
useEffect(() => {
|
|
84
|
-
if (!warningMessage) {
|
|
85
|
-
return;
|
|
86
|
-
}
|
|
87
|
-
const toastId = toast.warn(warningMessage, { persistent: true });
|
|
88
|
-
if (toastId) {
|
|
89
|
-
setWarningMessage(undefined);
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
console.warn("useUpgradeCheck: toast not yet available, will retry on next render");
|
|
93
|
-
}
|
|
94
|
-
}, [warningMessage, toast]);
|
|
95
|
-
// Process version-check response — update warning/required state
|
|
96
|
-
useEffect(() => {
|
|
97
|
-
if (result.isError) {
|
|
98
|
-
console.debug("Version check failed, continuing normally", result.error);
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
if (!result.isSuccess || !result.data) {
|
|
102
|
-
return;
|
|
103
|
-
}
|
|
104
|
-
const { message, status, updateUrl: responseUpdateUrl } = result.data;
|
|
105
|
-
if (status === "required") {
|
|
106
|
-
setIsRequired(true);
|
|
107
|
-
setRequiredMessage(message);
|
|
108
|
-
setIsWarning(false);
|
|
109
|
-
}
|
|
110
|
-
else if (status === "warning") {
|
|
111
|
-
setIsWarning(true);
|
|
112
|
-
setWarningMessage(message);
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
setIsWarning(false);
|
|
116
|
-
setIsRequired(false);
|
|
117
|
-
}
|
|
118
|
-
if (responseUpdateUrl) {
|
|
119
|
-
setUpdateUrl(responseUpdateUrl);
|
|
120
|
-
}
|
|
121
|
-
}, [result.data, result.error, result.isError, result.isSuccess]);
|
|
122
107
|
const canUpdate = IsWeb || !!updateUrl;
|
|
123
|
-
return {
|
|
108
|
+
return {
|
|
109
|
+
canUpdate,
|
|
110
|
+
isRequired,
|
|
111
|
+
isWarning,
|
|
112
|
+
onUpdate,
|
|
113
|
+
requiredMessage,
|
|
114
|
+
warningCheckCount,
|
|
115
|
+
warningMessage,
|
|
116
|
+
};
|
|
124
117
|
};
|
|
125
118
|
//# sourceMappingURL=useUpgradeCheck.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useUpgradeCheck.js","sourceRoot":"","sources":["../src/useUpgradeCheck.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"useUpgradeCheck.js","sourceRoot":"","sources":["../src/useUpgradeCheck.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":""}
|