@terreno/rtk 0.18.0 → 0.20.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.
Files changed (39) hide show
  1. package/README.md +6 -0
  2. package/dist/emptyApi.d.ts +4 -4
  3. package/dist/index.d.ts +1 -0
  4. package/dist/index.d.ts.map +1 -1
  5. package/dist/index.js +1 -0
  6. package/dist/index.js.map +1 -1
  7. package/dist/isolated/constants.isolated.js +22 -0
  8. package/dist/isolated/constants.isolated.js.map +1 -1
  9. package/dist/openFeatureReactSdkSpike.test.d.ts +2 -0
  10. package/dist/openFeatureReactSdkSpike.test.d.ts.map +1 -0
  11. package/dist/openFeatureReactSdkSpike.test.js +29 -0
  12. package/dist/openFeatureReactSdkSpike.test.js.map +1 -0
  13. package/dist/useFeatureFlags.d.ts +15 -15
  14. package/dist/useFeatureFlags.d.ts.map +1 -1
  15. package/dist/useFeatureFlags.js +65 -78
  16. package/dist/useFeatureFlags.js.map +1 -1
  17. package/dist/useFeatureFlags.test.js +119 -53
  18. package/dist/useFeatureFlags.test.js.map +1 -1
  19. package/dist/useServerStatus.test.d.ts +2 -0
  20. package/dist/useServerStatus.test.d.ts.map +1 -0
  21. package/dist/useServerStatus.test.js +182 -0
  22. package/dist/useServerStatus.test.js.map +1 -0
  23. package/dist/useTerrenoFeatureFlags.d.ts +39 -0
  24. package/dist/useTerrenoFeatureFlags.d.ts.map +1 -0
  25. package/dist/useTerrenoFeatureFlags.js +157 -0
  26. package/dist/useTerrenoFeatureFlags.js.map +1 -0
  27. package/dist/useTerrenoFeatureFlags.test.d.ts +2 -0
  28. package/dist/useTerrenoFeatureFlags.test.d.ts.map +1 -0
  29. package/dist/useTerrenoFeatureFlags.test.js +160 -0
  30. package/dist/useTerrenoFeatureFlags.test.js.map +1 -0
  31. package/package.json +7 -2
  32. package/src/index.ts +1 -0
  33. package/src/isolated/constants.isolated.ts +26 -0
  34. package/src/openFeatureReactSdkSpike.test.ts +36 -0
  35. package/src/useFeatureFlags.test.ts +143 -57
  36. package/src/useFeatureFlags.ts +91 -95
  37. package/src/useServerStatus.test.ts +266 -0
  38. package/src/useTerrenoFeatureFlags.test.ts +222 -0
  39. package/src/useTerrenoFeatureFlags.ts +226 -0
@@ -1,46 +1,54 @@
1
1
  import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
2
- import { renderHook } from "@testing-library/react-native";
2
+ import { NOOP_PROVIDER, OpenFeature } from "@openfeature/web-sdk";
3
+ import { renderHook, waitFor } from "@testing-library/react-native";
3
4
  import { resolveFeatureFlagsOptions, useFeatureFlags } from "./useFeatureFlags";
4
5
  describe("resolveFeatureFlagsOptions", () => {
5
6
  it("applies defaults when no argument is provided", () => {
6
7
  expect(resolveFeatureFlagsOptions()).toEqual({
7
8
  basePath: "/feature-flags",
9
+ domain: "feature-flags",
8
10
  skip: false,
9
11
  });
10
12
  });
11
13
  it("applies defaults when an empty options object is provided", () => {
12
14
  expect(resolveFeatureFlagsOptions({})).toEqual({
13
15
  basePath: "/feature-flags",
16
+ domain: "feature-flags",
14
17
  skip: false,
15
18
  });
16
19
  });
17
20
  it("treats a string argument as a legacy basePath with skip=false", () => {
18
21
  expect(resolveFeatureFlagsOptions("/custom-path")).toEqual({
19
22
  basePath: "/custom-path",
23
+ domain: "feature-flags",
20
24
  skip: false,
21
25
  });
22
26
  });
23
27
  it("preserves an empty string basePath when passed as a legacy string argument", () => {
24
28
  expect(resolveFeatureFlagsOptions("")).toEqual({
25
29
  basePath: "",
30
+ domain: "feature-flags",
26
31
  skip: false,
27
32
  });
28
33
  });
29
34
  it("uses options.basePath when provided", () => {
30
35
  expect(resolveFeatureFlagsOptions({ basePath: "/flags" })).toEqual({
31
36
  basePath: "/flags",
37
+ domain: "feature-flags",
32
38
  skip: false,
33
39
  });
34
40
  });
35
41
  it("uses options.skip when provided", () => {
36
42
  expect(resolveFeatureFlagsOptions({ skip: true })).toEqual({
37
43
  basePath: "/feature-flags",
44
+ domain: "feature-flags",
38
45
  skip: true,
39
46
  });
40
47
  });
41
48
  it("uses both options.basePath and options.skip when provided together", () => {
42
49
  expect(resolveFeatureFlagsOptions({ basePath: "/flags", skip: true })).toEqual({
43
50
  basePath: "/flags",
51
+ domain: "feature-flags",
44
52
  skip: true,
45
53
  });
46
54
  });
@@ -48,59 +56,104 @@ describe("resolveFeatureFlagsOptions", () => {
48
56
  expect(resolveFeatureFlagsOptions("/custom-path").skip).toBe(false);
49
57
  });
50
58
  });
59
+ const boolDef = (variant) => ({
60
+ defaultVariant: variant,
61
+ disabled: false,
62
+ variants: { off: false, on: true },
63
+ });
51
64
  const buildApi = (queryResult) => {
52
65
  const refetch = mock(() => { });
53
66
  const capturedQueryBuilder = [];
54
- const useEvaluateFeatureFlagsQuery = mock(() => ({
55
- data: queryResult.data,
56
- error: queryResult.error,
57
- isLoading: queryResult.isLoading ?? false,
58
- refetch,
59
- }));
67
+ const useTerrenoFlagConfigurationQuery = mock(() => {
68
+ const hasData = Boolean(queryResult.data);
69
+ return {
70
+ data: queryResult.data,
71
+ error: queryResult.error,
72
+ isFetching: queryResult.isFetching ?? false,
73
+ isLoading: queryResult.isLoading ?? false,
74
+ isSuccess: queryResult.isSuccess ?? hasData,
75
+ refetch,
76
+ };
77
+ });
60
78
  const api = {
61
79
  injectEndpoints: mock((opts) => {
62
80
  const builder = {
63
81
  query: (def) => {
64
82
  capturedQueryBuilder.push(def.query());
65
- return { useQuery: useEvaluateFeatureFlagsQuery };
83
+ return { useQuery: useTerrenoFlagConfigurationQuery };
66
84
  },
67
85
  };
68
86
  opts.endpoints(builder);
69
- return { useEvaluateFeatureFlagsQuery };
87
+ return { useTerrenoFlagConfigurationQuery };
70
88
  }),
71
89
  };
72
- return { api, capturedQueryBuilder, refetch, useEvaluateFeatureFlagsQuery };
90
+ return { api, capturedQueryBuilder, refetch, useTerrenoFlagConfigurationQuery };
73
91
  };
74
92
  describe("useFeatureFlags hook", () => {
75
93
  const debugCalls = [];
76
94
  const originalDebug = console.debug;
77
- beforeEach(() => {
95
+ beforeEach(async () => {
78
96
  debugCalls.length = 0;
79
97
  console.debug = (...args) => {
80
98
  debugCalls.push(args);
81
99
  };
100
+ await OpenFeature.setProviderAndWait("feature-flags", NOOP_PROVIDER);
82
101
  });
83
- afterEach(() => {
102
+ afterEach(async () => {
84
103
  console.debug = originalDebug;
104
+ await OpenFeature.setProviderAndWait("feature-flags", NOOP_PROVIDER);
85
105
  });
86
- it("builds the evaluate endpoint with the default basePath", () => {
87
- const { api, capturedQueryBuilder } = buildApi({ data: { foo: true } });
88
- renderHook(() => useFeatureFlags(api));
106
+ it("builds the flagConfiguration endpoint with the default basePath", () => {
107
+ const { api, capturedQueryBuilder } = buildApi({ data: { foo: boolDef("on") } });
108
+ renderHook(() => useFeatureFlags(api, {
109
+ userId: "u1",
110
+ }));
89
111
  expect(capturedQueryBuilder[0]).toEqual({
90
112
  method: "GET",
91
- url: "/feature-flags/evaluate",
113
+ url: "/feature-flags/flagConfiguration",
92
114
  });
93
115
  });
94
- it("builds the evaluate endpoint with a custom basePath from legacy string argument", () => {
95
- const { api, capturedQueryBuilder } = buildApi({ data: { foo: true } });
116
+ it("builds the flagConfiguration endpoint with a custom basePath from legacy string argument", () => {
117
+ const { api, capturedQueryBuilder } = buildApi({ data: { foo: boolDef("on") } });
96
118
  renderHook(() => useFeatureFlags(api, "/flags"));
97
- expect(capturedQueryBuilder[0]).toEqual({ method: "GET", url: "/flags/evaluate" });
119
+ expect(capturedQueryBuilder[0]).toEqual({ method: "GET", url: "/flags/flagConfiguration" });
98
120
  });
99
- it("returns flag accessors that read boolean and string values", () => {
121
+ it("projects FlagConfiguration to flat flags like the legacy /evaluate map", async () => {
100
122
  const { api } = buildApi({
101
- data: { booleanOff: false, booleanOn: true, variantFlag: "variant-a" },
123
+ data: {
124
+ b1: boolDef("on"),
125
+ v1: {
126
+ defaultVariant: "compact",
127
+ disabled: false,
128
+ variants: { compact: "compact", detailed: "detailed" },
129
+ },
130
+ },
131
+ });
132
+ const { result } = renderHook(() => useFeatureFlags(api, { userId: "u1" }));
133
+ await waitFor(() => {
134
+ expect(result.current.isLoading).toBe(false);
135
+ });
136
+ expect(result.current.flags).toEqual({
137
+ b1: true,
138
+ v1: "compact",
139
+ });
140
+ });
141
+ it("returns flag accessors that read boolean and string values", async () => {
142
+ const { api } = buildApi({
143
+ data: {
144
+ booleanOff: boolDef("off"),
145
+ booleanOn: boolDef("on"),
146
+ variantFlag: {
147
+ defaultVariant: "variant-a",
148
+ disabled: false,
149
+ variants: { compact: "compact", detailed: "detailed", "variant-a": "variant-a" },
150
+ },
151
+ },
152
+ });
153
+ const { result } = renderHook(() => useFeatureFlags(api, { userId: "u1" }));
154
+ await waitFor(() => {
155
+ expect(result.current.isLoading).toBe(false);
102
156
  });
103
- const { result } = renderHook(() => useFeatureFlags(api));
104
157
  expect(result.current.getFlag("booleanOn")).toBe(true);
105
158
  expect(result.current.getFlag("booleanOff")).toBe(false);
106
159
  expect(result.current.getFlag("variantFlag")).toBe(false);
@@ -109,75 +162,88 @@ describe("useFeatureFlags hook", () => {
109
162
  expect(result.current.getVariant("missing")).toBeNull();
110
163
  });
111
164
  it("returns an empty flags map when no data is available", () => {
112
- const { api } = buildApi({ isLoading: true });
113
- const { result } = renderHook(() => useFeatureFlags(api));
165
+ const { api } = buildApi({ isLoading: true, isSuccess: false });
166
+ const { result } = renderHook(() => useFeatureFlags(api, { userId: "u1" }));
114
167
  expect(result.current.flags).toEqual({});
115
168
  expect(result.current.isLoading).toBe(true);
116
169
  });
117
- it("exposes refetch from the underlying query hook", () => {
118
- const { api, refetch } = buildApi({ data: { foo: true } });
119
- const { result } = renderHook(() => useFeatureFlags(api));
170
+ it("exposes refetch from the underlying query hook", async () => {
171
+ const { api, refetch } = buildApi({ data: { foo: boolDef("on") } });
172
+ const { result } = renderHook(() => useFeatureFlags(api, { userId: "u1" }));
173
+ await waitFor(() => {
174
+ expect(result.current.isLoading).toBe(false);
175
+ });
120
176
  result.current.refetch();
121
177
  expect(refetch).toHaveBeenCalled();
122
178
  });
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");
179
+ it("logs flagConfiguration request started when loading begins without prior data", () => {
180
+ const { api } = buildApi({ isLoading: true, isSuccess: false });
181
+ renderHook(() => useFeatureFlags(api, { userId: "u1" }));
182
+ const started = debugCalls.find((args) => args[0] === "[feature-flags] flagConfiguration request started");
127
183
  expect(started).toBeDefined();
128
184
  });
129
- it("logs evaluate request completed when data resolves after a loading phase", () => {
130
- const api = buildApi({ isLoading: true });
185
+ it("logs flagConfiguration request completed when data resolves after a loading phase", async () => {
186
+ const api = buildApi({ isLoading: true, isSuccess: false });
131
187
  const { rerender } = renderHook(({ queryResult }) => {
132
- api.useEvaluateFeatureFlagsQuery.mockImplementationOnce(() => ({
188
+ api.useTerrenoFlagConfigurationQuery.mockImplementationOnce(() => ({
133
189
  data: queryResult.data,
134
190
  error: queryResult.error,
191
+ isFetching: queryResult.isFetching ?? false,
135
192
  isLoading: queryResult.isLoading ?? false,
193
+ isSuccess: queryResult.isSuccess ?? Boolean(queryResult.data),
136
194
  refetch: api.refetch,
137
195
  }));
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");
196
+ return useFeatureFlags(api.api, {
197
+ userId: "u1",
198
+ });
199
+ }, { initialProps: { queryResult: { isLoading: true, isSuccess: false } } });
200
+ rerender({ queryResult: { data: { alpha: boolDef("on") }, isLoading: false, isSuccess: true } });
201
+ await waitFor(() => {
202
+ const completed = debugCalls.find((args) => args[0] === "[feature-flags] flagConfiguration request completed");
203
+ expect(completed).toBeDefined();
204
+ });
205
+ const started = debugCalls.find((args) => args[0] === "[feature-flags] flagConfiguration request started");
143
206
  expect(started).toBeDefined();
144
- expect(completed).toBeDefined();
145
207
  });
146
- it("injects the evaluate endpoint only once per (api, basePath)", () => {
208
+ it("injects the flagConfiguration endpoint only once per (api, basePath)", () => {
147
209
  let injectCallCount = 0;
148
210
  const refetch = mock(() => { });
149
- const useEvaluateFeatureFlagsQuery = mock(() => ({
211
+ const useTerrenoFlagConfigurationQuery = mock(() => ({
150
212
  data: {},
151
213
  error: undefined,
214
+ isFetching: false,
152
215
  isLoading: false,
216
+ isSuccess: true,
153
217
  refetch,
154
218
  }));
155
219
  const api = {
156
220
  injectEndpoints: () => {
157
221
  injectCallCount += 1;
158
- return { useEvaluateFeatureFlagsQuery };
222
+ return { useTerrenoFlagConfigurationQuery };
159
223
  },
160
224
  };
161
- const { rerender } = renderHook(() => useFeatureFlags(api));
225
+ const { rerender } = renderHook(() => useFeatureFlags(api, { userId: "u1" }));
162
226
  rerender(undefined);
163
227
  rerender(undefined);
164
- // The hook reuses the cached enhanced api after the first render so the
165
- // dev-mode RTK warning about re-injecting endpoints never fires.
166
228
  expect(injectCallCount).toBe(1);
167
229
  });
168
- it("logs evaluate request failed when error is returned after loading", () => {
169
- const api = buildApi({ isLoading: true });
230
+ it("logs flagConfiguration request failed when error is returned after loading", () => {
231
+ const api = buildApi({ isLoading: true, isSuccess: false });
170
232
  const { rerender } = renderHook(({ queryResult }) => {
171
- api.useEvaluateFeatureFlagsQuery.mockImplementationOnce(() => ({
233
+ api.useTerrenoFlagConfigurationQuery.mockImplementationOnce(() => ({
172
234
  data: queryResult.data,
173
235
  error: queryResult.error,
236
+ isFetching: queryResult.isFetching ?? false,
174
237
  isLoading: queryResult.isLoading ?? false,
238
+ isSuccess: queryResult.isSuccess ?? false,
175
239
  refetch: api.refetch,
176
240
  }));
177
- return useFeatureFlags(api.api);
178
- }, { initialProps: { queryResult: { isLoading: true } } });
179
- rerender({ queryResult: { error: new Error("boom"), isLoading: false } });
180
- const failed = debugCalls.find((args) => args[0] === "[feature-flags] evaluate request failed");
241
+ return useFeatureFlags(api.api, {
242
+ userId: "u1",
243
+ });
244
+ }, { initialProps: { queryResult: { isLoading: true, isSuccess: false } } });
245
+ rerender({ queryResult: { error: new Error("boom"), isLoading: false, isSuccess: false } });
246
+ const failed = debugCalls.find((args) => args[0] === "[feature-flags] flagConfiguration request failed");
181
247
  expect(failed).toBeDefined();
182
248
  });
183
249
  });
@@ -1 +1 @@
1
- {"version":3,"file":"useFeatureFlags.test.js","sourceRoot":"","sources":["../src/useFeatureFlags.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useFeatureFlags.test.js","sourceRoot":"","sources":["../src/useFeatureFlags.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useServerStatus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useServerStatus.test.d.ts","sourceRoot":"","sources":["../src/useServerStatus.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,182 @@
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 React from "react";
5
+ import { Provider } from "react-redux";
6
+ import { offlineReducer, setOnlineStatus } from "./offlineSlice";
7
+ import { useServerStatus } from "./useServerStatus";
8
+ const createTestStore = () => configureStore({
9
+ reducer: { offline: offlineReducer },
10
+ });
11
+ const createWrapper = (store) => {
12
+ const Wrapper = ({ children }) => React.createElement(Provider, { children, store });
13
+ return Wrapper;
14
+ };
15
+ const createMockWindow = () => {
16
+ const listeners = new Map();
17
+ return {
18
+ _dispatch: (event) => {
19
+ for (const handler of listeners.get(event) ?? []) {
20
+ handler();
21
+ }
22
+ },
23
+ _listeners: listeners,
24
+ addEventListener: (event, handler) => {
25
+ if (!listeners.has(event)) {
26
+ listeners.set(event, new Set());
27
+ }
28
+ listeners.get(event)?.add(handler);
29
+ },
30
+ removeEventListener: (event, handler) => {
31
+ listeners.get(event)?.delete(handler);
32
+ },
33
+ };
34
+ };
35
+ describe("useServerStatus", () => {
36
+ let store;
37
+ let originalFetch;
38
+ let mockWindow;
39
+ beforeEach(() => {
40
+ store = createTestStore();
41
+ originalFetch = globalThis.fetch;
42
+ mockWindow = createMockWindow();
43
+ globalThis.window = mockWindow;
44
+ });
45
+ afterEach(() => {
46
+ globalThis.fetch = originalFetch;
47
+ });
48
+ it("returns initial online state from offlineSlice", () => {
49
+ globalThis.fetch = mock(async () => new Response("ok", { status: 200 }));
50
+ const { result, unmount } = renderHook(() => useServerStatus({ skip: true }), {
51
+ wrapper: createWrapper(store),
52
+ });
53
+ expect(result.current.isOnline).toBe(true);
54
+ expect(result.current.queueLength).toBe(0);
55
+ expect(result.current.isSyncing).toBe(false);
56
+ unmount();
57
+ });
58
+ it("skips polling when skip is true", async () => {
59
+ const fetchFn = mock(async () => new Response("ok", { status: 200 }));
60
+ globalThis.fetch = fetchFn;
61
+ const { unmount } = renderHook(() => useServerStatus({ skip: true }), {
62
+ wrapper: createWrapper(store),
63
+ });
64
+ await act(async () => {
65
+ await new Promise((resolve) => setTimeout(resolve, 50));
66
+ });
67
+ expect(fetchFn).not.toHaveBeenCalled();
68
+ unmount();
69
+ });
70
+ it("dispatches online status when health check succeeds", async () => {
71
+ store.dispatch(setOnlineStatus(false));
72
+ const fetchFn = mock(async () => new Response("ok", { status: 200 }));
73
+ globalThis.fetch = fetchFn;
74
+ const { unmount } = renderHook(() => useServerStatus({
75
+ healthUrl: "http://localhost:4000/health",
76
+ pollIntervalMs: 60000,
77
+ }), { wrapper: createWrapper(store) });
78
+ await act(async () => {
79
+ await new Promise((resolve) => setTimeout(resolve, 100));
80
+ });
81
+ expect(fetchFn).toHaveBeenCalled();
82
+ expect(store.getState().offline.isOnline).toBe(true);
83
+ unmount();
84
+ });
85
+ it("dispatches offline status when health check returns non-ok", async () => {
86
+ const fetchFn = mock(async () => new Response("error", { status: 500 }));
87
+ globalThis.fetch = fetchFn;
88
+ const { unmount } = renderHook(() => useServerStatus({
89
+ healthUrl: "http://localhost:4000/health",
90
+ pollIntervalMs: 60000,
91
+ }), { wrapper: createWrapper(store) });
92
+ await act(async () => {
93
+ await new Promise((resolve) => setTimeout(resolve, 100));
94
+ });
95
+ expect(fetchFn).toHaveBeenCalled();
96
+ expect(store.getState().offline.isOnline).toBe(false);
97
+ unmount();
98
+ });
99
+ it("dispatches offline status when health check throws", async () => {
100
+ const fetchFn = mock(async () => {
101
+ throw new Error("Network error");
102
+ });
103
+ globalThis.fetch = fetchFn;
104
+ const { unmount } = renderHook(() => useServerStatus({
105
+ healthUrl: "http://localhost:4000/health",
106
+ pollIntervalMs: 60000,
107
+ }), { wrapper: createWrapper(store) });
108
+ await act(async () => {
109
+ await new Promise((resolve) => setTimeout(resolve, 100));
110
+ });
111
+ expect(fetchFn).toHaveBeenCalled();
112
+ expect(store.getState().offline.isOnline).toBe(false);
113
+ unmount();
114
+ });
115
+ it("does not change status when health succeeds and already online", async () => {
116
+ const fetchFn = mock(async () => new Response("ok", { status: 200 }));
117
+ globalThis.fetch = fetchFn;
118
+ const { unmount } = renderHook(() => useServerStatus({
119
+ healthUrl: "http://localhost:4000/health",
120
+ pollIntervalMs: 60000,
121
+ }), { wrapper: createWrapper(store) });
122
+ await act(async () => {
123
+ await new Promise((resolve) => setTimeout(resolve, 100));
124
+ });
125
+ expect(fetchFn).toHaveBeenCalled();
126
+ expect(store.getState().offline.isOnline).toBe(true);
127
+ unmount();
128
+ });
129
+ it("accepts custom health URL", async () => {
130
+ const fetchFn = mock(async () => new Response("ok", { status: 200 }));
131
+ globalThis.fetch = fetchFn;
132
+ const { unmount } = renderHook(() => useServerStatus({
133
+ healthUrl: "http://custom-api:3000/ping",
134
+ pollIntervalMs: 60000,
135
+ skip: false,
136
+ }), { wrapper: createWrapper(store) });
137
+ await act(async () => {
138
+ await new Promise((resolve) => setTimeout(resolve, 100));
139
+ });
140
+ expect(fetchFn).toHaveBeenCalled();
141
+ const callUrl = fetchFn.mock.calls[0][0];
142
+ expect(callUrl).toBe("http://custom-api:3000/ping");
143
+ unmount();
144
+ });
145
+ it("dispatches offline when browser fires offline event", async () => {
146
+ const fetchFn = mock(async () => new Response("ok", { status: 200 }));
147
+ globalThis.fetch = fetchFn;
148
+ const { unmount } = renderHook(() => useServerStatus({
149
+ healthUrl: "http://localhost:4000/health",
150
+ pollIntervalMs: 60000,
151
+ }), { wrapper: createWrapper(store) });
152
+ await act(async () => {
153
+ await new Promise((resolve) => setTimeout(resolve, 50));
154
+ });
155
+ expect(store.getState().offline.isOnline).toBe(true);
156
+ act(() => {
157
+ mockWindow._dispatch("offline");
158
+ });
159
+ expect(store.getState().offline.isOnline).toBe(false);
160
+ unmount();
161
+ });
162
+ it("triggers health check when browser fires online event", async () => {
163
+ store.dispatch(setOnlineStatus(false));
164
+ const fetchFn = mock(async () => new Response("ok", { status: 200 }));
165
+ globalThis.fetch = fetchFn;
166
+ const { unmount } = renderHook(() => useServerStatus({
167
+ healthUrl: "http://localhost:4000/health",
168
+ pollIntervalMs: 60000,
169
+ }), { wrapper: createWrapper(store) });
170
+ await act(async () => {
171
+ await new Promise((resolve) => setTimeout(resolve, 100));
172
+ });
173
+ fetchFn.mockClear();
174
+ await act(async () => {
175
+ mockWindow._dispatch("online");
176
+ await new Promise((resolve) => setTimeout(resolve, 100));
177
+ });
178
+ expect(fetchFn).toHaveBeenCalled();
179
+ unmount();
180
+ });
181
+ });
182
+ //# sourceMappingURL=useServerStatus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useServerStatus.test.js","sourceRoot":"","sources":["../src/useServerStatus.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ import { OpenFeature } from "@openfeature/web-sdk";
2
+ import type { Api } from "@reduxjs/toolkit/query/react";
3
+ /** Shape returned by `GET .../flagConfiguration` (OpenFeature static flag map). */
4
+ export interface TerrenoFlagDefinition {
5
+ defaultVariant: string;
6
+ disabled: boolean;
7
+ variants: Record<string, boolean | string>;
8
+ }
9
+ export type TerrenoFlagConfiguration = Record<string, TerrenoFlagDefinition>;
10
+ export interface UseTerrenoFeatureFlagsOptions {
11
+ basePath?: string;
12
+ skip?: boolean;
13
+ /** Current user id — included in RTK cache key and OpenFeature targeting context. */
14
+ userId?: string | null;
15
+ /** Optional socket.io client for live flag refresh. */
16
+ socket?: {
17
+ off: (event: string, handler: (...args: unknown[]) => void) => void;
18
+ on: (event: string, handler: (...args: unknown[]) => void) => void;
19
+ } | null;
20
+ socketEventName?: string;
21
+ /** OpenFeature domain — must match `<OpenFeatureProvider domain>` on the client. */
22
+ domain?: string;
23
+ }
24
+ export interface UseTerrenoFeatureFlagsResult {
25
+ client: ReturnType<typeof OpenFeature.getClient>;
26
+ error: unknown;
27
+ flags: TerrenoFlagConfiguration;
28
+ isLoading: boolean;
29
+ refetch: () => unknown;
30
+ }
31
+ type FlagsApi = Api<any, any, any, any>;
32
+ /**
33
+ * Wires Terreno's bulk `/flagConfiguration` fetch into OpenFeature's
34
+ * {@link TypedInMemoryProvider} for the given domain. Prefer OpenFeature React
35
+ * hooks (`useBooleanFlagValue`, etc.) as children of `<OpenFeatureProvider>`.
36
+ */
37
+ export declare const useTerrenoFeatureFlags: (api: FlagsApi, options?: UseTerrenoFeatureFlagsOptions) => UseTerrenoFeatureFlagsResult;
38
+ export {};
39
+ //# sourceMappingURL=useTerrenoFeatureFlags.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useTerrenoFeatureFlags.d.ts","sourceRoot":"","sources":["../src/useTerrenoFeatureFlags.ts"],"names":[],"mappings":"AAAA,OAAO,EAAgB,WAAW,EAAwB,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,8BAA8B,CAAC;AAGtD,mFAAmF;AACnF,MAAM,WAAW,qBAAqB;IACpC,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,MAAM,CAAC,CAAC;CAC5C;AAED,MAAM,MAAM,wBAAwB,GAAG,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC;AAE7E,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qFAAqF;IACrF,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,uDAAuD;IACvD,MAAM,CAAC,EAAE;QACP,GAAG,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;QACpE,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,KAAK,IAAI,CAAC;KACpE,GAAG,IAAI,CAAC;IACT,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,oFAAoF;IACpF,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,4BAA4B;IAC3C,MAAM,EAAE,UAAU,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC;IACjD,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,wBAAwB,CAAC;IAChC,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,OAAO,CAAC;CACxB;AAGD,KAAK,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAuCxC;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GACjC,KAAK,QAAQ,EACb,UAAU,6BAA6B,KACtC,4BA6IF,CAAC"}