@terreno/rtk 0.14.0 → 0.14.2
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 +4 -4
- package/dist/authSlice.d.ts.map +1 -1
- package/dist/authSlice.js +7 -7
- package/dist/authSlice.js.map +1 -1
- package/dist/betterAuthSlice.d.ts.map +1 -1
- package/dist/betterAuthSlice.js +3 -2
- package/dist/betterAuthSlice.js.map +1 -1
- package/dist/constants.test.js +41 -0
- package/dist/constants.test.js.map +1 -1
- package/dist/emptyApi.d.ts +1 -1
- package/dist/emptyApi.d.ts.map +1 -1
- package/dist/emptyApi.js +2 -2
- package/dist/emptyApi.js.map +1 -1
- package/dist/mongooseSlice.d.ts +3 -2
- package/dist/mongooseSlice.d.ts.map +1 -1
- package/dist/mongooseSlice.js +3 -4
- package/dist/mongooseSlice.js.map +1 -1
- package/dist/offlineMiddleware.d.ts.map +1 -1
- package/dist/offlineMiddleware.js +1 -3
- package/dist/offlineMiddleware.js.map +1 -1
- package/dist/offlineSlice.d.ts +24 -2
- package/dist/offlineSlice.d.ts.map +1 -1
- package/dist/offlineSlice.js +2 -2
- package/dist/offlineSlice.js.map +1 -1
- package/dist/tagGenerator.d.ts.map +1 -1
- package/dist/tagGenerator.js +3 -10
- package/dist/tagGenerator.js.map +1 -1
- package/dist/useFeatureFlags.d.ts +5 -2
- package/dist/useFeatureFlags.d.ts.map +1 -1
- package/dist/useFeatureFlags.js +35 -16
- package/dist/useFeatureFlags.js.map +1 -1
- package/dist/useFeatureFlags.test.js +22 -0
- package/dist/useFeatureFlags.test.js.map +1 -1
- package/dist/useServerStatus.js +1 -1
- package/dist/useServerStatus.js.map +1 -1
- package/package.json +2 -2
- package/src/authSlice.ts +9 -9
- package/src/betterAuthSlice.ts +3 -2
- package/src/constants.test.ts +45 -0
- package/src/emptyApi.ts +3 -3
- package/src/mongooseSlice.ts +4 -5
- package/src/offlineMiddleware.ts +1 -3
- package/src/offlineSlice.ts +5 -3
- package/src/tagGenerator.ts +2 -8
- package/src/useFeatureFlags.test.ts +25 -0
- package/src/useFeatureFlags.ts +47 -22
- package/src/useServerStatus.ts +1 -1
package/dist/offlineSlice.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createSlice } from "@reduxjs/toolkit";
|
|
1
|
+
import { createSelector, createSlice } from "@reduxjs/toolkit";
|
|
2
2
|
import { REHYDRATE } from "redux-persist";
|
|
3
3
|
import { IsWeb } from "./platform";
|
|
4
4
|
const getInitialOnlineStatus = () => {
|
|
@@ -60,6 +60,6 @@ export const selectIsOnlineSafe = (state) => state.offline?.isOnline ?? true;
|
|
|
60
60
|
export const selectOfflineQueue = (state) => state.offline.queue;
|
|
61
61
|
export const selectQueueLength = (state) => state.offline.queue.length;
|
|
62
62
|
export const selectConflicts = (state) => state.offline.conflicts;
|
|
63
|
-
export const selectUndismissedConflicts = (
|
|
63
|
+
export const selectUndismissedConflicts = createSelector(selectConflicts, (conflicts) => conflicts.filter((c) => !c.dismissed));
|
|
64
64
|
export const selectIsSyncing = (state) => state.offline.isSyncing;
|
|
65
65
|
//# sourceMappingURL=offlineSlice.js.map
|
package/dist/offlineSlice.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offlineSlice.js","sourceRoot":"","sources":["../src/offlineSlice.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,WAAW,EAAqB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"offlineSlice.js","sourceRoot":"","sources":["../src/offlineSlice.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tagGenerator.d.ts","sourceRoot":"","sources":["../src/tagGenerator.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tagGenerator.d.ts","sourceRoot":"","sources":["../src/tagGenerator.ts"],"names":[],"mappings":"AAEA,UAAU,iBAAiB;IACzB,IAAI,CAAC,EAAE,KAAK,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAC,CAAC,CAAC;IAC5B,GAAG,CAAC,EAAE,MAAM,CAAC;CACd;AAED,KAAK,QAAQ,GAAG,MAAM,GAAG;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AACrD,KAAK,aAAa,GAAG,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,GAAG,SAAS,KAAK,QAAQ,EAAE,CAAC;AAElF,UAAU,iBAAiB;IACzB,YAAY,EAAE,aAAa,CAAC;IAC5B,eAAe,EAAE,aAAa,CAAC;CAChC;AAED,UAAU,gBAAgB;IACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AA8BD,eAAO,MAAM,YAAY,GACvB,KAAK,gBAAgB,EACrB,UAAU,MAAM,EAAE,KACjB,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAyClC,CAAC"}
|
package/dist/tagGenerator.js
CHANGED
|
@@ -1,24 +1,19 @@
|
|
|
1
|
-
//
|
|
2
|
-
// only at the full collection level
|
|
1
|
+
// Tag generation utilities for RTK Query endpoint cache invalidation by individual IDs
|
|
3
2
|
const providesIdTags = (path) => (result) => result ? [...(result?.data?.map(({ _id }) => ({ id: _id, type: path })) ?? []), path] : [path];
|
|
4
3
|
const providesIdTag = (path) => (result) => {
|
|
5
4
|
return result ? [{ id: result._id, type: path }] : [path];
|
|
6
5
|
};
|
|
7
6
|
const invalidatesIdTags = (path) => (result) => result ? [...(result?.data?.map(({ _id }) => ({ id: _id, type: path })) ?? []), path] : [path];
|
|
7
|
+
/** Strips CRUD prefixes and "ById" suffix to extract the base resource name. */
|
|
8
8
|
const cleanEndpointStringToGenerateTag = (string) => {
|
|
9
|
-
// Define the prefixes and suffix
|
|
10
9
|
const prefixes = ["patch", "get", "delete"];
|
|
11
10
|
const suffix = "ById";
|
|
12
|
-
// Create a regular expression to match the prefixes and suffix
|
|
13
11
|
const prefixPattern = `^(${prefixes.join("|")})`;
|
|
14
12
|
const suffixPattern = `${suffix}$`;
|
|
15
13
|
const regex = new RegExp(`${prefixPattern}|${suffixPattern}`, "gi");
|
|
16
|
-
// Replace the matched parts and convert to lowercase
|
|
17
14
|
return string.replace(regex, "")?.toLowerCase();
|
|
18
15
|
};
|
|
19
16
|
export const generateTags = (api, tagTypes) => {
|
|
20
|
-
// take the api, and for each get and list endpoint, generate tags that invalidate the cache by id
|
|
21
|
-
// and by the list endpoint
|
|
22
17
|
const endpoints = api.endpoints;
|
|
23
18
|
const tags = {};
|
|
24
19
|
Object.keys(endpoints).forEach((endpoint) => {
|
|
@@ -28,9 +23,7 @@ export const generateTags = (api, tagTypes) => {
|
|
|
28
23
|
if (endpoint.toLowerCase().includes("get")) {
|
|
29
24
|
// List endpoints
|
|
30
25
|
if (!endpoint.toLowerCase().includes("byid")) {
|
|
31
|
-
const tag = tagTypes.find((t) =>
|
|
32
|
-
// remove "get" from the endpoint name and "ById" from the endpoint name
|
|
33
|
-
t.toLowerCase().includes(cleanEndpointStringToGenerateTag(endpoint)));
|
|
26
|
+
const tag = tagTypes.find((t) => t.toLowerCase().includes(cleanEndpointStringToGenerateTag(endpoint)));
|
|
34
27
|
if (tag) {
|
|
35
28
|
tags[endpoint] = { providesTags: providesIdTags(tag) };
|
|
36
29
|
}
|
package/dist/tagGenerator.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tagGenerator.js","sourceRoot":"","sources":["../src/tagGenerator.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"tagGenerator.js","sourceRoot":"","sources":["../src/tagGenerator.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import type { Api } from "@reduxjs/toolkit/query/react";
|
|
2
|
-
|
|
2
|
+
interface FlagValues {
|
|
3
|
+
[key: string]: boolean | string | null;
|
|
4
|
+
}
|
|
5
|
+
type FlagsApi = Api<any, any, any, any>;
|
|
3
6
|
interface UseFeatureFlagsResult {
|
|
4
7
|
flags: FlagValues;
|
|
5
8
|
getFlag: (key: string) => boolean;
|
|
@@ -47,6 +50,6 @@ interface ResolvedFeatureFlagsOptions {
|
|
|
47
50
|
* - `object` -> `{basePath: opts.basePath ?? "/feature-flags", skip: opts.skip ?? false}`
|
|
48
51
|
*/
|
|
49
52
|
export declare const resolveFeatureFlagsOptions: (basePathOrOptions?: string | UseFeatureFlagsOptions) => ResolvedFeatureFlagsOptions;
|
|
50
|
-
export declare function useFeatureFlags(api:
|
|
53
|
+
export declare function useFeatureFlags(api: FlagsApi, basePathOrOptions?: string | UseFeatureFlagsOptions): UseFeatureFlagsResult;
|
|
51
54
|
export {};
|
|
52
55
|
//# 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,
|
|
1
|
+
{"version":3,"file":"useFeatureFlags.d.ts","sourceRoot":"","sources":["../src/useFeatureFlags.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAC,GAAG,EAAC,MAAM,8BAA8B,CAAC;AAGtD,UAAU,UAAU;IAClB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,IAAI,CAAC;CACxC;AAGD,KAAK,QAAQ,GAAG,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AAuCxC,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,CAC7B,GAAG,EAAE,QAAQ,EACb,iBAAiB,CAAC,EAAE,MAAM,GAAG,sBAAsB,GAClD,qBAAqB,CAyEvB"}
|
package/dist/useFeatureFlags.js
CHANGED
|
@@ -1,4 +1,36 @@
|
|
|
1
|
-
import { useCallback, useEffect,
|
|
1
|
+
import { useCallback, useEffect, useRef } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Cache the enhanced api per (api, basePath). `injectEndpoints` logs a console
|
|
4
|
+
* error in development whenever an endpoint with the same name is re-injected
|
|
5
|
+
* with `overrideExisting: false`, so calling it on every render of every
|
|
6
|
+
* consumer would flood the console. WeakMap-by-api lets the GC reclaim entries
|
|
7
|
+
* when the api object is unreachable.
|
|
8
|
+
*/
|
|
9
|
+
const enhancedApiCache = new WeakMap();
|
|
10
|
+
const getEnhancedApi = (api, basePath) => {
|
|
11
|
+
let byBase = enhancedApiCache.get(api);
|
|
12
|
+
if (!byBase) {
|
|
13
|
+
byBase = new Map();
|
|
14
|
+
enhancedApiCache.set(api, byBase);
|
|
15
|
+
}
|
|
16
|
+
const cached = byBase.get(basePath);
|
|
17
|
+
if (cached) {
|
|
18
|
+
return cached;
|
|
19
|
+
}
|
|
20
|
+
const enhanced = api.injectEndpoints({
|
|
21
|
+
endpoints: (builder) => ({
|
|
22
|
+
evaluateFeatureFlags: builder.query({
|
|
23
|
+
query: () => ({
|
|
24
|
+
method: "GET",
|
|
25
|
+
url: `${basePath}/evaluate`,
|
|
26
|
+
}),
|
|
27
|
+
}),
|
|
28
|
+
}),
|
|
29
|
+
overrideExisting: false,
|
|
30
|
+
});
|
|
31
|
+
byBase.set(basePath, enhanced);
|
|
32
|
+
return enhanced;
|
|
33
|
+
};
|
|
2
34
|
/**
|
|
3
35
|
* Normalizes the legacy-compatible `basePathOrOptions` argument into a
|
|
4
36
|
* `{basePath, skip}` pair with defaults applied.
|
|
@@ -15,22 +47,9 @@ export const resolveFeatureFlagsOptions = (basePathOrOptions) => {
|
|
|
15
47
|
};
|
|
16
48
|
// Overloaded signature preserves backwards compatibility with callers that
|
|
17
49
|
// pass a string basePath as the second argument.
|
|
18
|
-
export function useFeatureFlags(
|
|
19
|
-
// biome-ignore lint/suspicious/noExplicitAny: RTK Query API generic typing is intentionally flexible here.
|
|
20
|
-
api, basePathOrOptions) {
|
|
50
|
+
export function useFeatureFlags(api, basePathOrOptions) {
|
|
21
51
|
const { basePath, skip } = resolveFeatureFlagsOptions(basePathOrOptions);
|
|
22
|
-
const enhancedApi =
|
|
23
|
-
endpoints: (builder) => ({
|
|
24
|
-
evaluateFeatureFlags: builder.query({
|
|
25
|
-
query: () => ({
|
|
26
|
-
method: "GET",
|
|
27
|
-
url: `${basePath}/evaluate`,
|
|
28
|
-
}),
|
|
29
|
-
}),
|
|
30
|
-
}),
|
|
31
|
-
overrideExisting: false,
|
|
32
|
-
}), [api, basePath]);
|
|
33
|
-
// biome-ignore lint/suspicious/noExplicitAny: Endpoint hook is injected dynamically by RTK Query.
|
|
52
|
+
const enhancedApi = getEnhancedApi(api, basePath);
|
|
34
53
|
const useEvaluateQuery = enhancedApi.useEvaluateFeatureFlagsQuery;
|
|
35
54
|
const { data, isLoading, error, refetch } = useEvaluateQuery(undefined, { skip });
|
|
36
55
|
const evaluateStartedAtRef = useRef(null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useFeatureFlags.js","sourceRoot":"","sources":["../src/useFeatureFlags.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,WAAW,EAAE,SAAS,EAAE,
|
|
1
|
+
{"version":3,"file":"useFeatureFlags.js","sourceRoot":"","sources":["../src/useFeatureFlags.ts"],"names":[],"mappings":"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"}
|
|
@@ -143,6 +143,28 @@ describe("useFeatureFlags hook", () => {
|
|
|
143
143
|
expect(started).toBeDefined();
|
|
144
144
|
expect(completed).toBeDefined();
|
|
145
145
|
});
|
|
146
|
+
it("injects the evaluate endpoint only once per (api, basePath)", () => {
|
|
147
|
+
let injectCallCount = 0;
|
|
148
|
+
const refetch = mock(() => { });
|
|
149
|
+
const useEvaluateFeatureFlagsQuery = mock(() => ({
|
|
150
|
+
data: {},
|
|
151
|
+
error: undefined,
|
|
152
|
+
isLoading: false,
|
|
153
|
+
refetch,
|
|
154
|
+
}));
|
|
155
|
+
const api = {
|
|
156
|
+
injectEndpoints: () => {
|
|
157
|
+
injectCallCount += 1;
|
|
158
|
+
return { useEvaluateFeatureFlagsQuery };
|
|
159
|
+
},
|
|
160
|
+
};
|
|
161
|
+
const { rerender } = renderHook(() => useFeatureFlags(api));
|
|
162
|
+
rerender(undefined);
|
|
163
|
+
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
|
+
expect(injectCallCount).toBe(1);
|
|
167
|
+
});
|
|
146
168
|
it("logs evaluate request failed when error is returned after loading", () => {
|
|
147
169
|
const api = buildApi({ isLoading: true });
|
|
148
170
|
const { rerender } = renderHook(({ queryResult }) => {
|
|
@@ -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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"}
|
package/dist/useServerStatus.js
CHANGED
|
@@ -67,7 +67,7 @@ export const useServerStatus = (options = {}) => {
|
|
|
67
67
|
}, [skip, checkHealth, offlineStatus.isOnline, pollIntervalMs, offlinePollIntervalMs]);
|
|
68
68
|
// Also respond to browser online/offline events for instant detection
|
|
69
69
|
useEffect(() => {
|
|
70
|
-
if (skip || typeof window === "undefined") {
|
|
70
|
+
if (skip || typeof window === "undefined" || typeof window.addEventListener !== "function") {
|
|
71
71
|
return;
|
|
72
72
|
}
|
|
73
73
|
const handleOffline = () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useServerStatus.js","sourceRoot":"","sources":["../src/useServerStatus.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"useServerStatus.js","sourceRoot":"","sources":["../src/useServerStatus.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"@better-auth/expo": "^1.2.8",
|
|
4
4
|
"@react-native-async-storage/async-storage": "2.2.0",
|
|
5
5
|
"@reduxjs/toolkit": "^2.11.1",
|
|
6
|
-
"@terreno/ui": "0.14.
|
|
6
|
+
"@terreno/ui": "0.14.2",
|
|
7
7
|
"async-mutex": "^0.5.0",
|
|
8
8
|
"axios": "^1.13.2",
|
|
9
9
|
"axios-retry": "^4.5.0",
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"test:coverage": "bun run ../scripts/check-coverage.ts"
|
|
68
68
|
},
|
|
69
69
|
"types": "dist/index.d.ts",
|
|
70
|
-
"version": "0.14.
|
|
70
|
+
"version": "0.14.2"
|
|
71
71
|
}
|
package/src/authSlice.ts
CHANGED
|
@@ -4,17 +4,18 @@ import AsyncStorage from "@react-native-async-storage/async-storage";
|
|
|
4
4
|
import {createListenerMiddleware, createSlice, type PayloadAction} from "@reduxjs/toolkit";
|
|
5
5
|
import type {Api, BaseQueryFn, EndpointBuilder} from "@reduxjs/toolkit/query/react";
|
|
6
6
|
import * as SecureStore from "expo-secure-store";
|
|
7
|
+
import {DateTime} from "luxon";
|
|
7
8
|
import {useSelector} from "react-redux";
|
|
8
9
|
|
|
9
10
|
import {LOGOUT_ACTION_TYPE, type RootState} from "./constants";
|
|
10
11
|
import {IsWeb} from "./platform";
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
interface AuthState {
|
|
13
14
|
userId: string | null;
|
|
14
15
|
error: string | null;
|
|
15
16
|
isAuthenticating: boolean;
|
|
16
17
|
lastTokenRefreshTimestamp: number | null;
|
|
17
|
-
}
|
|
18
|
+
}
|
|
18
19
|
|
|
19
20
|
export interface UserResponse {
|
|
20
21
|
data: {
|
|
@@ -46,12 +47,11 @@ export interface GoogleLoginRequest {
|
|
|
46
47
|
idToken: string;
|
|
47
48
|
}
|
|
48
49
|
|
|
49
|
-
|
|
50
|
-
export function generateProfileEndpoints(
|
|
50
|
+
export const generateProfileEndpoints = (
|
|
51
51
|
// biome-ignore lint/suspicious/noExplicitAny: Generic
|
|
52
52
|
builder: EndpointBuilder<BaseQueryFn<unknown, unknown, unknown>, any, string>,
|
|
53
53
|
path: string
|
|
54
|
-
) {
|
|
54
|
+
) => {
|
|
55
55
|
return {
|
|
56
56
|
// This is a slightly different version of emailSignUp for creating another user using the
|
|
57
57
|
// auth/signup endpoint. This is useful for things like creating a user from an admin account.
|
|
@@ -99,7 +99,7 @@ export function generateProfileEndpoints(
|
|
|
99
99
|
}),
|
|
100
100
|
}),
|
|
101
101
|
};
|
|
102
|
-
}
|
|
102
|
+
};
|
|
103
103
|
|
|
104
104
|
// biome-ignore lint/suspicious/noExplicitAny: Generic
|
|
105
105
|
export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
@@ -183,7 +183,7 @@ export const generateAuthSlice = (api: Api<any, any, any, any, any>) => {
|
|
|
183
183
|
state.isAuthenticating = false;
|
|
184
184
|
},
|
|
185
185
|
tokenRefreshedSuccess: (state) => {
|
|
186
|
-
state.lastTokenRefreshTimestamp =
|
|
186
|
+
state.lastTokenRefreshTimestamp = DateTime.now().toMillis();
|
|
187
187
|
},
|
|
188
188
|
},
|
|
189
189
|
});
|
|
@@ -298,7 +298,7 @@ export const useSelectIsAuthenticating = (): boolean => {
|
|
|
298
298
|
return useSelector((state: RootState): boolean => state.auth?.isAuthenticating ?? false);
|
|
299
299
|
};
|
|
300
300
|
|
|
301
|
-
export async
|
|
301
|
+
export const getAuthToken = async (): Promise<string | null> => {
|
|
302
302
|
let token: string | null;
|
|
303
303
|
|
|
304
304
|
if (!IsWeb) {
|
|
@@ -313,4 +313,4 @@ export async function getAuthToken(): Promise<string | null> {
|
|
|
313
313
|
}
|
|
314
314
|
}
|
|
315
315
|
return token;
|
|
316
|
-
}
|
|
316
|
+
};
|
package/src/betterAuthSlice.ts
CHANGED
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import {createListenerMiddleware, createSlice, type PayloadAction} from "@reduxjs/toolkit";
|
|
9
|
+
import {DateTime} from "luxon";
|
|
9
10
|
|
|
10
11
|
import type {BetterAuthClientInterface, BetterAuthUser} from "./betterAuthTypes";
|
|
11
12
|
|
|
@@ -125,7 +126,7 @@ export const generateBetterAuthSlice = (config: GenerateBetterAuthSliceConfig) =
|
|
|
125
126
|
state.user = null;
|
|
126
127
|
state.isLoading = false;
|
|
127
128
|
state.error = null;
|
|
128
|
-
state.lastSyncTimestamp =
|
|
129
|
+
state.lastSyncTimestamp = DateTime.now().toMillis();
|
|
129
130
|
},
|
|
130
131
|
|
|
131
132
|
/**
|
|
@@ -162,7 +163,7 @@ export const generateBetterAuthSlice = (config: GenerateBetterAuthSliceConfig) =
|
|
|
162
163
|
state.user = action.payload.user;
|
|
163
164
|
state.isLoading = false;
|
|
164
165
|
state.error = null;
|
|
165
|
-
state.lastSyncTimestamp =
|
|
166
|
+
state.lastSyncTimestamp = DateTime.now().toMillis();
|
|
166
167
|
},
|
|
167
168
|
},
|
|
168
169
|
});
|
package/src/constants.test.ts
CHANGED
|
@@ -142,6 +142,51 @@ describe("resolveBaseUrls", () => {
|
|
|
142
142
|
});
|
|
143
143
|
expect(urls.baseUrl).toBe("http://localhost:4000");
|
|
144
144
|
});
|
|
145
|
+
|
|
146
|
+
it("ignores BASE_URL from extra in dev mode and uses hostUri instead", () => {
|
|
147
|
+
const urls = resolveBaseUrls({
|
|
148
|
+
expoConstants: {
|
|
149
|
+
expoConfig: {extra: {BASE_URL: "https://api.prod.com"}, hostUri: "192.168.0.10:8081"},
|
|
150
|
+
},
|
|
151
|
+
isDev: true,
|
|
152
|
+
});
|
|
153
|
+
expect(urls.baseUrl).toBe("http://192.168.0.10:4000");
|
|
154
|
+
expect(urls.baseWebsocketsUrl).toBe("ws://192.168.0.10:4000/");
|
|
155
|
+
expect(urls.baseTasksUrl).toBe("http://192.168.0.10:4000/tasks");
|
|
156
|
+
});
|
|
157
|
+
|
|
158
|
+
it("falls back to experienceUrl when hostUri is empty string", () => {
|
|
159
|
+
const urls = resolveBaseUrls({
|
|
160
|
+
expoConstants: {
|
|
161
|
+
experienceUrl: "exp://10.0.0.5:19000",
|
|
162
|
+
expoConfig: {extra: {}, hostUri: ""},
|
|
163
|
+
},
|
|
164
|
+
isDev: true,
|
|
165
|
+
});
|
|
166
|
+
expect(urls.baseUrl).toBe("http://10.0.0.5:4000");
|
|
167
|
+
});
|
|
168
|
+
|
|
169
|
+
it("replaces 'api.' subdomain with 'tasks.' and 'ws.' for envApiUrl", () => {
|
|
170
|
+
const urls = resolveBaseUrls({
|
|
171
|
+
envApiUrl: "https://api.staging.example.io",
|
|
172
|
+
expoConstants: {expoConfig: {extra: {}}},
|
|
173
|
+
isDev: false,
|
|
174
|
+
});
|
|
175
|
+
expect(urls.baseUrl).toBe("https://api.staging.example.io");
|
|
176
|
+
expect(urls.baseWebsocketsUrl).toBe("https://ws.staging.example.io/");
|
|
177
|
+
expect(urls.baseTasksUrl).toBe("https://tasks.staging.example.io/tasks");
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
it("handles envApiUrl without 'api.' subdomain gracefully", () => {
|
|
181
|
+
const urls = resolveBaseUrls({
|
|
182
|
+
envApiUrl: "https://backend.example.com",
|
|
183
|
+
expoConstants: {expoConfig: {extra: {}}},
|
|
184
|
+
isDev: false,
|
|
185
|
+
});
|
|
186
|
+
expect(urls.baseUrl).toBe("https://backend.example.com");
|
|
187
|
+
expect(urls.baseWebsocketsUrl).toBe("https://backend.example.com/");
|
|
188
|
+
expect(urls.baseTasksUrl).toBe("https://backend.example.com/tasks");
|
|
189
|
+
});
|
|
145
190
|
});
|
|
146
191
|
|
|
147
192
|
describe("module-level exports", () => {
|
package/src/emptyApi.ts
CHANGED
|
@@ -42,10 +42,10 @@ interface TokenPayload {
|
|
|
42
42
|
exp: number;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
|
-
export async
|
|
45
|
+
export const getTokenExpirationTimes = async (): Promise<{
|
|
46
46
|
refreshRemainingSecs?: number;
|
|
47
47
|
authRemainingSecs?: number;
|
|
48
|
-
}> {
|
|
48
|
+
}> => {
|
|
49
49
|
let refreshToken: string | null;
|
|
50
50
|
let authToken: string | null;
|
|
51
51
|
if (!IsWeb) {
|
|
@@ -81,7 +81,7 @@ export async function getTokenExpirationTimes(): Promise<{
|
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
return {authRemainingSecs: authTimeRemaining, refreshRemainingSecs: refreshTimeRemaining};
|
|
84
|
-
}
|
|
84
|
+
};
|
|
85
85
|
|
|
86
86
|
// Helper function to decode token and get expiration info
|
|
87
87
|
export const getFriendlyExpirationInfo = async (): Promise<string> => {
|
package/src/mongooseSlice.ts
CHANGED
|
@@ -6,14 +6,13 @@ export interface ListResponse<T> {
|
|
|
6
6
|
data?: T[];
|
|
7
7
|
}
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export function populateId<T extends {_id: string}>(
|
|
9
|
+
/** Given an ID and the {data} from a list query, return the object with that ID. */
|
|
10
|
+
export const populateId = <T extends {_id: string}>(
|
|
12
11
|
id?: string,
|
|
13
12
|
objs?: ListResponse<T>
|
|
14
|
-
): T | undefined {
|
|
13
|
+
): T | undefined => {
|
|
15
14
|
if (!id || !objs) {
|
|
16
15
|
return undefined;
|
|
17
16
|
}
|
|
18
17
|
return objs?.data?.find((obj) => obj?._id === id);
|
|
19
|
-
}
|
|
18
|
+
};
|
package/src/offlineMiddleware.ts
CHANGED
|
@@ -121,11 +121,9 @@ export const buildOptimisticCreateItem = (
|
|
|
121
121
|
};
|
|
122
122
|
};
|
|
123
123
|
|
|
124
|
+
/** Derives the collection tag from an endpoint name (e.g. "patchTodosById" → "todos"). */
|
|
124
125
|
const inferTagType = (endpointName: string): string => {
|
|
125
|
-
// Infer tag type from endpoint name for cache invalidation.
|
|
126
|
-
// Convention: patchTodosById -> "todos", postTodos -> "todos", deleteTodosById -> "todos"
|
|
127
126
|
let name = endpointName.replace(/^(post|patch|delete)/, "").replace(/ById$/, "");
|
|
128
|
-
// Convert first char to lowercase
|
|
129
127
|
name = name.charAt(0).toLowerCase() + name.slice(1);
|
|
130
128
|
return name;
|
|
131
129
|
};
|
package/src/offlineSlice.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {createSlice, type PayloadAction} from "@reduxjs/toolkit";
|
|
1
|
+
import {createSelector, createSlice, type PayloadAction} from "@reduxjs/toolkit";
|
|
2
2
|
import {REHYDRATE} from "redux-persist";
|
|
3
3
|
|
|
4
4
|
import {IsWeb} from "./platform";
|
|
@@ -124,7 +124,9 @@ export const selectQueueLength = (state: {offline: OfflineState}): number =>
|
|
|
124
124
|
export const selectConflicts = (state: {offline: OfflineState}): ConflictRecord[] =>
|
|
125
125
|
state.offline.conflicts;
|
|
126
126
|
|
|
127
|
-
export const selectUndismissedConflicts = (
|
|
128
|
-
|
|
127
|
+
export const selectUndismissedConflicts = createSelector(
|
|
128
|
+
selectConflicts,
|
|
129
|
+
(conflicts): ConflictRecord[] => conflicts.filter((c) => !c.dismissed)
|
|
130
|
+
);
|
|
129
131
|
|
|
130
132
|
export const selectIsSyncing = (state: {offline: OfflineState}): boolean => state.offline.isSyncing;
|
package/src/tagGenerator.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
//
|
|
2
|
-
// only at the full collection level
|
|
1
|
+
// Tag generation utilities for RTK Query endpoint cache invalidation by individual IDs
|
|
3
2
|
|
|
4
3
|
interface TagProviderResult {
|
|
5
4
|
data?: Array<{_id: string}>;
|
|
@@ -34,17 +33,15 @@ const invalidatesIdTags =
|
|
|
34
33
|
(result: TagProviderResult | null | undefined): TagEntry[] =>
|
|
35
34
|
result ? [...(result?.data?.map(({_id}) => ({id: _id, type: path})) ?? []), path] : [path];
|
|
36
35
|
|
|
36
|
+
/** Strips CRUD prefixes and "ById" suffix to extract the base resource name. */
|
|
37
37
|
const cleanEndpointStringToGenerateTag = (string: string): string => {
|
|
38
|
-
// Define the prefixes and suffix
|
|
39
38
|
const prefixes = ["patch", "get", "delete"];
|
|
40
39
|
const suffix = "ById";
|
|
41
40
|
|
|
42
|
-
// Create a regular expression to match the prefixes and suffix
|
|
43
41
|
const prefixPattern = `^(${prefixes.join("|")})`;
|
|
44
42
|
const suffixPattern = `${suffix}$`;
|
|
45
43
|
const regex = new RegExp(`${prefixPattern}|${suffixPattern}`, "gi");
|
|
46
44
|
|
|
47
|
-
// Replace the matched parts and convert to lowercase
|
|
48
45
|
return string.replace(regex, "")?.toLowerCase();
|
|
49
46
|
};
|
|
50
47
|
|
|
@@ -52,8 +49,6 @@ export const generateTags = (
|
|
|
52
49
|
api: ApiWithEndpoints,
|
|
53
50
|
tagTypes: string[]
|
|
54
51
|
): Record<string, EndpointTagConfig> => {
|
|
55
|
-
// take the api, and for each get and list endpoint, generate tags that invalidate the cache by id
|
|
56
|
-
// and by the list endpoint
|
|
57
52
|
const endpoints = api.endpoints;
|
|
58
53
|
const tags: Record<string, Partial<EndpointTagConfig>> = {};
|
|
59
54
|
Object.keys(endpoints).forEach((endpoint) => {
|
|
@@ -64,7 +59,6 @@ export const generateTags = (
|
|
|
64
59
|
// List endpoints
|
|
65
60
|
if (!endpoint.toLowerCase().includes("byid")) {
|
|
66
61
|
const tag = tagTypes.find((t: string) =>
|
|
67
|
-
// remove "get" from the endpoint name and "ById" from the endpoint name
|
|
68
62
|
t.toLowerCase().includes(cleanEndpointStringToGenerateTag(endpoint))
|
|
69
63
|
);
|
|
70
64
|
if (tag) {
|
|
@@ -188,6 +188,31 @@ describe("useFeatureFlags hook", () => {
|
|
|
188
188
|
expect(completed).toBeDefined();
|
|
189
189
|
});
|
|
190
190
|
|
|
191
|
+
it("injects the evaluate endpoint only once per (api, basePath)", () => {
|
|
192
|
+
let injectCallCount = 0;
|
|
193
|
+
const refetch = mock(() => {});
|
|
194
|
+
const useEvaluateFeatureFlagsQuery = mock(() => ({
|
|
195
|
+
data: {},
|
|
196
|
+
error: undefined,
|
|
197
|
+
isLoading: false,
|
|
198
|
+
refetch,
|
|
199
|
+
}));
|
|
200
|
+
const api = {
|
|
201
|
+
injectEndpoints: () => {
|
|
202
|
+
injectCallCount += 1;
|
|
203
|
+
return {useEvaluateFeatureFlagsQuery};
|
|
204
|
+
},
|
|
205
|
+
};
|
|
206
|
+
const {rerender} = renderHook(() =>
|
|
207
|
+
useFeatureFlags(api as unknown as Parameters<typeof useFeatureFlags>[0])
|
|
208
|
+
);
|
|
209
|
+
rerender(undefined);
|
|
210
|
+
rerender(undefined);
|
|
211
|
+
// The hook reuses the cached enhanced api after the first render so the
|
|
212
|
+
// dev-mode RTK warning about re-injecting endpoints never fires.
|
|
213
|
+
expect(injectCallCount).toBe(1);
|
|
214
|
+
});
|
|
215
|
+
|
|
191
216
|
it("logs evaluate request failed when error is returned after loading", () => {
|
|
192
217
|
const api = buildApi({isLoading: true});
|
|
193
218
|
const {rerender} = renderHook(
|