@veams/status-quo-query 0.10.0 → 0.12.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/README.md +212 -10
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -2
- package/dist/index.js.map +1 -1
- package/dist/provider.d.ts +1 -0
- package/dist/provider.js +2 -0
- package/dist/provider.js.map +1 -1
- package/dist/query.d.ts +26 -15
- package/dist/query.js +40 -31
- package/dist/query.js.map +1 -1
- package/dist/react/hooks/index.d.ts +1 -0
- package/dist/react/hooks/index.js +2 -0
- package/dist/react/hooks/index.js.map +1 -0
- package/dist/react/hooks/use-query-handle.d.ts +2 -0
- package/dist/react/hooks/use-query-handle.js +71 -0
- package/dist/react/hooks/use-query-handle.js.map +1 -0
- package/dist/react/hooks/use-query-subscription.d.ts +1 -0
- package/dist/react/hooks/use-query-subscription.js +2 -0
- package/dist/react/hooks/use-query-subscription.js.map +1 -0
- package/dist/react/index.d.ts +1 -0
- package/dist/react/index.js +2 -0
- package/dist/react/index.js.map +1 -0
- package/eslint.config.mjs +13 -2
- package/jest.config.cjs +2 -2
- package/package.json +21 -10
- package/src/__tests__/provider.spec.ts +8 -0
- package/src/index.ts +0 -2
- package/src/provider.ts +6 -2
- package/src/query.ts +84 -68
- package/src/react/__tests__/use-query-handle.spec.tsx +104 -0
- package/src/react/hooks/index.ts +1 -0
- package/src/react/hooks/use-query-handle.ts +96 -0
- package/src/react/index.ts +1 -0
- package/tsconfig.eslint.json +2 -1
- package/tsconfig.json +5 -2
- package/dist/query-registry.d.ts +0 -9
- package/dist/query-registry.js +0 -28
- package/dist/query-registry.js.map +0 -1
- package/src/__tests__/query-registry.spec.ts +0 -101
- package/src/query-registry.ts +0 -52
package/dist/query.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO;AAaL,iEAAiE;AACjE,aAAa,GAUd,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAIL,0BAA0B,GAC3B,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useQueryHandle } from './use-query-handle.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/hooks/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// Import the React hooks needed to memoize callbacks, hold mutable cache state,
|
|
2
|
+
// and connect an external store to React rendering.
|
|
3
|
+
import { useCallback, useRef, useSyncExternalStore } from 'react';
|
|
4
|
+
// Subscribe a React component to a QueryHandle and return its latest snapshot.
|
|
5
|
+
export function useQueryHandle(
|
|
6
|
+
// Receive the external query handle instance to subscribe to.
|
|
7
|
+
queryHandle) {
|
|
8
|
+
// Count store notifications so we can tell when our cached snapshot is stale.
|
|
9
|
+
const snapshotVersionRef = useRef(0);
|
|
10
|
+
// Cache one client-side snapshot per observed version to keep getSnapshot stable.
|
|
11
|
+
const snapshotCacheRef = useRef(null);
|
|
12
|
+
// Cache the server snapshot separately for the useSyncExternalStore SSR fallback.
|
|
13
|
+
const serverSnapshotCacheRef = useRef(null);
|
|
14
|
+
// Create the subscribe function expected by useSyncExternalStore.
|
|
15
|
+
const subscribe = useCallback(
|
|
16
|
+
// React passes a listener that must run whenever the external store changes.
|
|
17
|
+
(listener) =>
|
|
18
|
+
// Forward the subscription to the query handle.
|
|
19
|
+
queryHandle.subscribe(() => {
|
|
20
|
+
// Bump the version so later reads know the previous cache is outdated.
|
|
21
|
+
snapshotVersionRef.current += 1;
|
|
22
|
+
// Drop the cached client snapshot because the store just changed.
|
|
23
|
+
snapshotCacheRef.current = null;
|
|
24
|
+
// Drop the cached server snapshot for the same reason.
|
|
25
|
+
serverSnapshotCacheRef.current = null;
|
|
26
|
+
// Notify React that it should read a fresh snapshot.
|
|
27
|
+
listener();
|
|
28
|
+
}),
|
|
29
|
+
// Recreate the subscription function only when the handle instance changes.
|
|
30
|
+
[queryHandle]);
|
|
31
|
+
// Read the current client snapshot in a referentially stable way for React.
|
|
32
|
+
const getSnapshot = useCallback(() => {
|
|
33
|
+
// Read the latest store version number.
|
|
34
|
+
const version = snapshotVersionRef.current;
|
|
35
|
+
// Read the last cached client snapshot, if there is one.
|
|
36
|
+
const cachedSnapshot = snapshotCacheRef.current;
|
|
37
|
+
// Reuse the cached snapshot when it was produced for the current version.
|
|
38
|
+
if (cachedSnapshot && cachedSnapshot.version === version) {
|
|
39
|
+
// Return the cached snapshot so repeated reads in the same render stay stable.
|
|
40
|
+
return cachedSnapshot.snapshot;
|
|
41
|
+
}
|
|
42
|
+
// Ask the query handle for the latest snapshot because the cache is empty or stale.
|
|
43
|
+
const snapshot = queryHandle.getSnapshot();
|
|
44
|
+
// Store the new snapshot together with the version it belongs to.
|
|
45
|
+
snapshotCacheRef.current = {
|
|
46
|
+
snapshot,
|
|
47
|
+
version,
|
|
48
|
+
};
|
|
49
|
+
// Return the freshly read snapshot to React.
|
|
50
|
+
return snapshot;
|
|
51
|
+
}, [queryHandle]);
|
|
52
|
+
// Read the server snapshot used by React during SSR or hydration fallback paths.
|
|
53
|
+
const getServerSnapshot = useCallback(() => {
|
|
54
|
+
// Read the cached server snapshot, if one was stored earlier.
|
|
55
|
+
const cachedSnapshot = serverSnapshotCacheRef.current;
|
|
56
|
+
// Reuse the cached server snapshot to keep server reads stable.
|
|
57
|
+
if (cachedSnapshot) {
|
|
58
|
+
// Return the cached server snapshot directly.
|
|
59
|
+
return cachedSnapshot;
|
|
60
|
+
}
|
|
61
|
+
// Ask the query handle for a snapshot because no server cache exists yet.
|
|
62
|
+
const snapshot = queryHandle.getSnapshot();
|
|
63
|
+
// Cache that snapshot for the next server read.
|
|
64
|
+
serverSnapshotCacheRef.current = snapshot;
|
|
65
|
+
// Return the freshly read server snapshot.
|
|
66
|
+
return snapshot;
|
|
67
|
+
}, [queryHandle]);
|
|
68
|
+
// Let React subscribe to the external store and read snapshots through the callbacks above.
|
|
69
|
+
return useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=use-query-handle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-query-handle.js","sourceRoot":"","sources":["../../../src/react/hooks/use-query-handle.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,oDAAoD;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAelE,+EAA+E;AAC/E,MAAM,UAAU,cAAc;AAC5B,8DAA8D;AAC9D,WAAuC;IAEvC,8EAA8E;IAC9E,MAAM,kBAAkB,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;IACrC,kFAAkF;IAClF,MAAM,gBAAgB,GAAG,MAAM,CAA2C,IAAI,CAAC,CAAC;IAChF,kFAAkF;IAClF,MAAM,sBAAsB,GAAG,MAAM,CAA4C,IAAI,CAAC,CAAC;IAEvF,kEAAkE;IAClE,MAAM,SAAS,GAAG,WAAW;IAC3B,6EAA6E;IAC7E,CAAC,QAAkB,EAAE,EAAE;IACrB,gDAAgD;IAChD,WAAW,CAAC,SAAS,CAAC,GAAG,EAAE;QACzB,uEAAuE;QACvE,kBAAkB,CAAC,OAAO,IAAI,CAAC,CAAC;QAChC,kEAAkE;QAClE,gBAAgB,CAAC,OAAO,GAAG,IAAI,CAAC;QAChC,uDAAuD;QACvD,sBAAsB,CAAC,OAAO,GAAG,IAAI,CAAC;QACtC,qDAAqD;QACrD,QAAQ,EAAE,CAAC;IACb,CAAC,CAAC;IACJ,4EAA4E;IAC5E,CAAC,WAAW,CAAC,CACd,CAAC;IAEF,4EAA4E;IAC5E,MAAM,WAAW,GAAG,WAAW,CAAC,GAAG,EAAE;QACnC,wCAAwC;QACxC,MAAM,OAAO,GAAG,kBAAkB,CAAC,OAAO,CAAC;QAC3C,yDAAyD;QACzD,MAAM,cAAc,GAAG,gBAAgB,CAAC,OAAO,CAAC;QAEhD,0EAA0E;QAC1E,IAAI,cAAc,IAAI,cAAc,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YACzD,+EAA+E;YAC/E,OAAO,cAAc,CAAC,QAAQ,CAAC;QACjC,CAAC;QAED,oFAAoF;QACpF,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAC3C,kEAAkE;QAClE,gBAAgB,CAAC,OAAO,GAAG;YACzB,QAAQ;YACR,OAAO;SACR,CAAC;QAEF,6CAA6C;QAC7C,OAAO,QAAQ,CAAC;IAClB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,iFAAiF;IACjF,MAAM,iBAAiB,GAAG,WAAW,CAAC,GAAG,EAAE;QACzC,8DAA8D;QAC9D,MAAM,cAAc,GAAG,sBAAsB,CAAC,OAAO,CAAC;QAEtD,gEAAgE;QAChE,IAAI,cAAc,EAAE,CAAC;YACnB,8CAA8C;YAC9C,OAAO,cAAc,CAAC;QACxB,CAAC;QAED,0EAA0E;QAC1E,MAAM,QAAQ,GAAG,WAAW,CAAC,WAAW,EAAE,CAAC;QAC3C,gDAAgD;QAChD,sBAAsB,CAAC,OAAO,GAAG,QAAQ,CAAC;QAE1C,2CAA2C;QAC3C,OAAO,QAAQ,CAAC;IAClB,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IAElB,4FAA4F;IAC5F,OAAO,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;AACzE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useQueryHandle, useQuerySubscription } from './use-query-handle.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"use-query-subscription.js","sourceRoot":"","sources":["../../../src/react/hooks/use-query-subscription.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { useQueryHandle } from './hooks/index.js';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC"}
|
package/eslint.config.mjs
CHANGED
|
@@ -6,8 +6,8 @@ import globals from 'globals';
|
|
|
6
6
|
import tseslint from 'typescript-eslint';
|
|
7
7
|
|
|
8
8
|
const packageRoot = fileURLToPath(new URL('.', import.meta.url));
|
|
9
|
-
const sourceFiles = ['src/**/*.ts'];
|
|
10
|
-
const testFiles = ['src/**/*.{spec,test}.ts', 'src/**/__tests__/**/*.ts'];
|
|
9
|
+
const sourceFiles = ['src/**/*.{ts,tsx}'];
|
|
10
|
+
const testFiles = ['src/**/*.{spec,test}.{ts,tsx}', 'src/**/__tests__/**/*.{ts,tsx}'];
|
|
11
11
|
|
|
12
12
|
export default defineConfig(
|
|
13
13
|
{
|
|
@@ -20,9 +20,13 @@ export default defineConfig(
|
|
|
20
20
|
files: sourceFiles,
|
|
21
21
|
languageOptions: {
|
|
22
22
|
globals: {
|
|
23
|
+
...globals.browser,
|
|
23
24
|
...globals.node,
|
|
24
25
|
},
|
|
25
26
|
parserOptions: {
|
|
27
|
+
ecmaFeatures: {
|
|
28
|
+
jsx: true,
|
|
29
|
+
},
|
|
26
30
|
project: './tsconfig.eslint.json',
|
|
27
31
|
tsconfigRootDir: packageRoot,
|
|
28
32
|
},
|
|
@@ -46,5 +50,12 @@ export default defineConfig(
|
|
|
46
50
|
...globals.jest,
|
|
47
51
|
},
|
|
48
52
|
},
|
|
53
|
+
rules: {
|
|
54
|
+
'@typescript-eslint/no-unsafe-argument': 'off',
|
|
55
|
+
'@typescript-eslint/no-unsafe-assignment': 'off',
|
|
56
|
+
'@typescript-eslint/no-unsafe-member-access': 'off',
|
|
57
|
+
'@typescript-eslint/no-unsafe-return': 'off',
|
|
58
|
+
'@typescript-eslint/require-await': 'off',
|
|
59
|
+
},
|
|
49
60
|
}
|
|
50
61
|
);
|
package/jest.config.cjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
module.exports = {
|
|
2
|
-
extensionsToTreatAsEsm: ['.ts'],
|
|
2
|
+
extensionsToTreatAsEsm: ['.ts', '.tsx'],
|
|
3
3
|
transformIgnorePatterns: [],
|
|
4
4
|
transform: {
|
|
5
5
|
'^.+\\.(t|j)sx?$': '@swc/jest',
|
|
@@ -18,5 +18,5 @@ module.exports = {
|
|
|
18
18
|
testMatch: ['**/__tests__/**/?(*.)+(spec|test).[jt]s?(x)'],
|
|
19
19
|
reporters: ['default'],
|
|
20
20
|
moduleFileExtensions: ['mjs', 'js', 'ts', 'jsx', 'tsx'],
|
|
21
|
-
testEnvironment: '
|
|
21
|
+
testEnvironment: 'jsdom',
|
|
22
22
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@veams/status-quo-query",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "TanStack Query service layer for the VEAMS StatusQuo ecosystem.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.js",
|
|
@@ -12,6 +12,13 @@
|
|
|
12
12
|
},
|
|
13
13
|
"require": "./dist/index.js"
|
|
14
14
|
},
|
|
15
|
+
"./react": {
|
|
16
|
+
"import": {
|
|
17
|
+
"types": "./dist/react/index.d.ts",
|
|
18
|
+
"default": "./dist/react/index.js"
|
|
19
|
+
},
|
|
20
|
+
"require": "./dist/react/index.js"
|
|
21
|
+
},
|
|
15
22
|
"./mutation": {
|
|
16
23
|
"import": {
|
|
17
24
|
"types": "./dist/mutation.d.ts",
|
|
@@ -32,13 +39,6 @@
|
|
|
32
39
|
"default": "./dist/provider.js"
|
|
33
40
|
},
|
|
34
41
|
"require": "./dist/provider.js"
|
|
35
|
-
},
|
|
36
|
-
"./query-registry": {
|
|
37
|
-
"import": {
|
|
38
|
-
"types": "./dist/query-registry.d.ts",
|
|
39
|
-
"default": "./dist/query-registry.js"
|
|
40
|
-
},
|
|
41
|
-
"require": "./dist/query-registry.js"
|
|
42
42
|
}
|
|
43
43
|
},
|
|
44
44
|
"types": "dist/index.d.ts",
|
|
@@ -50,12 +50,18 @@
|
|
|
50
50
|
"check:types": "tsc --skipLibCheck --noEmit",
|
|
51
51
|
"compile": "npm-run-all bundle:ts",
|
|
52
52
|
"lint": "npm run lint:ts",
|
|
53
|
-
"lint:ts": "eslint --fix \"src/**/*.ts\"",
|
|
53
|
+
"lint:ts": "eslint --fix \"src/**/*.{ts,tsx}\"",
|
|
54
54
|
"test": "cross-env NODE_ENV=test jest --config jest.config.cjs",
|
|
55
55
|
"release": "npm run build && release-it"
|
|
56
56
|
},
|
|
57
57
|
"peerDependencies": {
|
|
58
|
-
"@tanstack/query-core": ">=5.0.0"
|
|
58
|
+
"@tanstack/query-core": ">=5.0.0",
|
|
59
|
+
"react": ">=18.0.0"
|
|
60
|
+
},
|
|
61
|
+
"peerDependenciesMeta": {
|
|
62
|
+
"react": {
|
|
63
|
+
"optional": true
|
|
64
|
+
}
|
|
59
65
|
},
|
|
60
66
|
"devDependencies": {
|
|
61
67
|
"@swc/core": "1.15.11",
|
|
@@ -63,9 +69,14 @@
|
|
|
63
69
|
"@tanstack/query-core": "5.91.2",
|
|
64
70
|
"@types/jest": "30.0.0",
|
|
65
71
|
"@types/node": "25.2.3",
|
|
72
|
+
"@types/react": "19.2.14",
|
|
73
|
+
"@types/react-dom": "19.0.0",
|
|
66
74
|
"cross-env": "10.1.0",
|
|
67
75
|
"jest": "30.3.0",
|
|
76
|
+
"jest-environment-jsdom": "30.3.0",
|
|
68
77
|
"npm-run-all": "4.1.5",
|
|
78
|
+
"react": "19.2.4",
|
|
79
|
+
"react-dom": "19.2.4",
|
|
69
80
|
"release-it": "19.2.4",
|
|
70
81
|
"tslib": "2.8.1",
|
|
71
82
|
"typescript": "5.9.3"
|
|
@@ -10,6 +10,7 @@ describe('Query Manager API', () => {
|
|
|
10
10
|
const cancelQueriesSpy = jest.spyOn(queryClient, 'cancelQueries');
|
|
11
11
|
const resetQueriesSpy = jest.spyOn(queryClient, 'resetQueries');
|
|
12
12
|
const removeQueriesSpy = jest.spyOn(queryClient, 'removeQueries');
|
|
13
|
+
const getQueryStateSpy = jest.spyOn(queryClient, 'getQueryState');
|
|
13
14
|
const fetchUser = jest.fn().mockResolvedValue({ id: 7 });
|
|
14
15
|
const fetchQuerySpy = jest.spyOn(queryClient, 'fetchQuery');
|
|
15
16
|
const manager = setupQueryManager(queryClient);
|
|
@@ -17,6 +18,12 @@ describe('Query Manager API', () => {
|
|
|
17
18
|
manager.setQueryData<{ id: number }>(['user', 42], { id: 42 });
|
|
18
19
|
|
|
19
20
|
expect(manager.getQueryData<{ id: number }>(['user', 42])).toEqual({ id: 42 });
|
|
21
|
+
expect(manager.getQueryState(['user', 42])).toEqual(
|
|
22
|
+
expect.objectContaining({
|
|
23
|
+
data: { id: 42 },
|
|
24
|
+
status: 'success',
|
|
25
|
+
})
|
|
26
|
+
);
|
|
20
27
|
expect(manager.unsafe_getClient()).toBe(queryClient);
|
|
21
28
|
await expect(
|
|
22
29
|
manager.fetchQuery({
|
|
@@ -37,6 +44,7 @@ describe('Query Manager API', () => {
|
|
|
37
44
|
queryFn: fetchUser,
|
|
38
45
|
staleTime: 60_000,
|
|
39
46
|
});
|
|
47
|
+
expect(getQueryStateSpy).toHaveBeenCalledWith(['user', 42]);
|
|
40
48
|
expect(invalidateQueriesSpy).toHaveBeenCalledWith({ queryKey: ['user'] });
|
|
41
49
|
expect(refetchQueriesSpy).toHaveBeenCalledWith({ queryKey: ['user'] });
|
|
42
50
|
expect(cancelQueriesSpy).toHaveBeenCalledWith({ queryKey: ['user'] });
|
package/src/index.ts
CHANGED
|
@@ -4,8 +4,6 @@ export * from './mutation.js';
|
|
|
4
4
|
export * from './query.js';
|
|
5
5
|
// Re-export all provider-related types and functions for cache management.
|
|
6
6
|
export * from './provider.js';
|
|
7
|
-
// Re-export query registry helpers for memoizing query services by key.
|
|
8
|
-
export * from './query-registry.js';
|
|
9
7
|
// Re-export tracked dependency types used by the additive tracked facade.
|
|
10
8
|
export type {
|
|
11
9
|
TrackedDependencyRecord,
|
package/src/provider.ts
CHANGED
|
@@ -56,9 +56,9 @@ export interface CreateQueryAndMutation {
|
|
|
56
56
|
export interface QueryManager {
|
|
57
57
|
// Factory for creating a dependency-tracked mutation service within the context of this provider.
|
|
58
58
|
createMutation: CreateMutation;
|
|
59
|
-
// Factory for creating a dependency-tracked query
|
|
59
|
+
// Factory for creating a dependency-tracked query handle within the context of this provider.
|
|
60
60
|
createQuery: CreateQuery;
|
|
61
|
-
// Factory for creating an untracked query
|
|
61
|
+
// Factory for creating an untracked query handle within the context of this provider.
|
|
62
62
|
createUntrackedQuery: CreateUntrackedQuery;
|
|
63
63
|
// Factory for creating an untracked mutation service within the context of this provider.
|
|
64
64
|
createUntrackedMutation: CreateUntrackedMutation;
|
|
@@ -70,6 +70,8 @@ export interface QueryManager {
|
|
|
70
70
|
fetchQuery: QueryClient['fetchQuery'];
|
|
71
71
|
// Synchronously retrieves a snapshot of the current query data.
|
|
72
72
|
getQueryData: QueryClient['getQueryData'];
|
|
73
|
+
// Synchronously retrieves the raw TanStack query state for one query key.
|
|
74
|
+
getQueryState: QueryClient['getQueryState'];
|
|
73
75
|
// Marks queries as invalid to trigger a refetch if they are active.
|
|
74
76
|
invalidateQueries: QueryClient['invalidateQueries'];
|
|
75
77
|
// Forces a refetch of queries matching the specified filters.
|
|
@@ -155,6 +157,8 @@ export function setupQueryManager(queryClient: QueryClient): QueryManager {
|
|
|
155
157
|
fetchQuery: queryClient.fetchQuery.bind(queryClient),
|
|
156
158
|
// Proxy for retrieving query data with this client context.
|
|
157
159
|
getQueryData: queryClient.getQueryData.bind(queryClient),
|
|
160
|
+
// Proxy for retrieving raw query state with this client context.
|
|
161
|
+
getQueryState: queryClient.getQueryState.bind(queryClient),
|
|
158
162
|
// Proxy for invalidating queries with this client context.
|
|
159
163
|
invalidateQueries: queryClient.invalidateQueries.bind(queryClient),
|
|
160
164
|
// Proxy for refetching queries with this client context.
|