@veams/status-quo-query 0.1.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.
@@ -0,0 +1,12 @@
1
+
2
+ > @veams/status-quo-query@0.1.0 build
3
+ > npm-run-all compile
4
+
5
+
6
+ > @veams/status-quo-query@0.1.0 compile
7
+ > npm-run-all bundle:ts
8
+
9
+
10
+ > @veams/status-quo-query@0.1.0 bundle:ts
11
+ > tsc --project tsconfig.json
12
+
@@ -0,0 +1,4 @@
1
+
2
+ > @veams/status-quo-query@0.1.0 check:types
3
+ > tsc --skipLibCheck --noEmit
4
+
@@ -0,0 +1,8 @@
1
+
2
+ > @veams/status-quo-query@0.1.0 lint
3
+ > npm run lint:ts
4
+
5
+
6
+ > @veams/status-quo-query@0.1.0 lint:ts
7
+ > eslint --fix "src/**/*.ts"
8
+
@@ -0,0 +1,13 @@
1
+
2
+ > @veams/status-quo-query@0.1.0 test
3
+ > cross-env NODE_ENV=test jest --config jest.config.cjs
4
+
5
+ PASS src/__tests__/cache.spec.ts
6
+ PASS src/__tests__/mutation.spec.ts
7
+ PASS src/__tests__/query.spec.ts
8
+
9
+ Test Suites: 3 passed, 3 total
10
+ Tests: 7 passed, 7 total
11
+ Snapshots: 0 total
12
+ Time: 0.816 s, estimated 1 s
13
+ Ran all test suites.
package/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0
4
+
5
+ - Initial package scaffold for TanStack Query and mutation services.
package/README.md ADDED
@@ -0,0 +1,173 @@
1
+ # @veams/status-quo-query
2
+
3
+ TanStack Query service helpers with a small subscribable surface that fits naturally into the StatusQuo ecosystem.
4
+
5
+ ## Install
6
+
7
+ ```bash
8
+ npm install @veams/status-quo-query @tanstack/query-core
9
+ ```
10
+
11
+ ## Package Exports
12
+
13
+ Root exports:
14
+
15
+ - `setupCache`
16
+ - `setupQuery`
17
+ - `setupMutation`
18
+ - `isQueryLoading`
19
+ - `toQueryMetaState`
20
+ - `QueryFetchStatus`
21
+ - `QueryStatus`
22
+ - `MutationStatus`
23
+ - `CacheApi`
24
+ - `CreateQuery`
25
+ - `CreateMutation`
26
+ - `QueryService`
27
+ - `MutationService`
28
+ - `QueryServiceSnapshot`
29
+ - `MutationServiceSnapshot`
30
+ - `QueryServiceOptions`
31
+ - `MutationServiceOptions`
32
+ - `QueryInvalidateOptions`
33
+ - `QueryMetaState`
34
+
35
+ Subpath exports:
36
+
37
+ - `@veams/status-quo-query/cache`
38
+ - `@veams/status-quo-query/query`
39
+ - `@veams/status-quo-query/mutation`
40
+
41
+ ## Quickstart
42
+
43
+ ```ts
44
+ import { QueryClient } from '@tanstack/query-core';
45
+ import {
46
+ setupCache,
47
+ } from '@veams/status-quo-query';
48
+
49
+ const queryClient = new QueryClient();
50
+ const cache = setupCache(queryClient);
51
+
52
+ const userQuery = cache.createQuery(['user', 42], () => fetchUser(42), {
53
+ enabled: false,
54
+ });
55
+ await userQuery.refetch();
56
+ await userQuery.invalidate({ refetchType: 'none' });
57
+
58
+ const updateUser = cache.createMutation((payload: UpdateUserPayload) => saveUser(payload));
59
+ await updateUser.mutate({ id: 42 });
60
+
61
+ await cache.invalidateQueries({ queryKey: ['user'] });
62
+ cache.setQueryData(['user', 42], (current) => current);
63
+ ```
64
+
65
+ ## API
66
+
67
+ ### `setupCache(queryClient)`
68
+
69
+ Creates the package-level cache facade around an existing TanStack `QueryClient`.
70
+
71
+ Returns `CacheApi` with:
72
+
73
+ - `createQuery(queryKey, queryFn, options?)`
74
+ - `createMutation(mutationFn, options?)`
75
+ - `cancelQueries(...)`
76
+ - `getQueryData(...)`
77
+ - `invalidateQueries(...)`
78
+ - `refetchQueries(...)`
79
+ - `removeQueries(...)`
80
+ - `resetQueries(...)`
81
+ - `setQueryData(...)`
82
+ - `unsafe_getClient()`
83
+
84
+ All cache methods forward directly to the corresponding `QueryClient` methods. `unsafe_getClient()` returns the raw TanStack client as an explicit escape hatch.
85
+
86
+ ### `setupQuery(queryClient)`
87
+
88
+ Creates a `createQuery` factory bound to a `QueryClient`.
89
+
90
+ `createQuery(queryKey, queryFn, options?)` returns `QueryService<TData, TError>`.
91
+
92
+ `QueryServiceOptions` is based on TanStack `QueryObserverOptions`, without `queryKey` and `queryFn` because those are provided directly to `createQuery`.
93
+
94
+ `QueryService` methods:
95
+
96
+ - `getSnapshot()`
97
+ - `subscribe(listener)`
98
+ - `refetch(options?)`
99
+ - `invalidate(options?)`
100
+ - `unsafe_getResult()`
101
+
102
+ `QueryServiceSnapshot<TData, TError>` fields:
103
+
104
+ - `data`
105
+ - `error`
106
+ - `fetchStatus`
107
+ - `status`
108
+ - `isError`
109
+ - `isFetching`
110
+ - `isPending`
111
+ - `isSuccess`
112
+
113
+ `invalidate(options?)` invalidates the query by its exact key. `QueryInvalidateOptions` supports:
114
+
115
+ - `refetchType`
116
+ - `cancelRefetch`
117
+ - `throwOnError`
118
+
119
+ `unsafe_getResult()` returns the raw TanStack `QueryObserverResult`.
120
+
121
+ ### `setupMutation(queryClient)`
122
+
123
+ Creates a `createMutation` factory bound to a `QueryClient`.
124
+
125
+ `createMutation(mutationFn, options?)` returns `MutationService<TData, TError, TVariables, TOnMutateResult>`.
126
+
127
+ `MutationServiceOptions` is based on TanStack `MutationObserverOptions`, without `mutationFn` because it is provided directly to `createMutation`.
128
+
129
+ `MutationService` methods:
130
+
131
+ - `getSnapshot()`
132
+ - `subscribe(listener)`
133
+ - `mutate(variables, options?)`
134
+ - `reset()`
135
+ - `unsafe_getResult()`
136
+
137
+ `MutationServiceSnapshot<TData, TError, TVariables>` fields:
138
+
139
+ - `data`
140
+ - `error`
141
+ - `status`
142
+ - `variables`
143
+ - `isError`
144
+ - `isIdle`
145
+ - `isPending`
146
+ - `isSuccess`
147
+
148
+ `unsafe_getResult()` returns the raw TanStack `MutationObserverResult`.
149
+
150
+ ### Query Helpers
151
+
152
+ `toQueryMetaState(snapshot)` reduces a query snapshot to:
153
+
154
+ - `status`
155
+ - `fetchStatus`
156
+
157
+ `isQueryLoading(metaState)` returns `true` when:
158
+
159
+ - `status === 'pending'`
160
+ - `fetchStatus === 'fetching'`
161
+
162
+ ### Status Types
163
+
164
+ - `QueryFetchStatus` re-exports TanStack `FetchStatus`
165
+ - `QueryStatus` re-exports TanStack query status
166
+ - `MutationStatus` re-exports TanStack mutation status
167
+
168
+ ## Design Notes
169
+
170
+ - `getSnapshot()` always returns passive state only.
171
+ - Commands live on the handle itself: `refetch`, `invalidate`, `mutate`, `reset`.
172
+ - Raw TanStack observer and client access is explicit through `unsafe_getResult()` and `unsafe_getClient()`.
173
+ - Cache-level operations live on `setupCache()`, not on individual snapshots.
@@ -0,0 +1,16 @@
1
+ import { type QueryClient } from '@tanstack/query-core';
2
+ import { type CreateMutation } from './mutation';
3
+ import { type CreateQuery } from './query';
4
+ export interface CacheApi {
5
+ createMutation: CreateMutation;
6
+ createQuery: CreateQuery;
7
+ cancelQueries: QueryClient['cancelQueries'];
8
+ getQueryData: QueryClient['getQueryData'];
9
+ invalidateQueries: QueryClient['invalidateQueries'];
10
+ refetchQueries: QueryClient['refetchQueries'];
11
+ removeQueries: QueryClient['removeQueries'];
12
+ resetQueries: QueryClient['resetQueries'];
13
+ setQueryData: QueryClient['setQueryData'];
14
+ unsafe_getClient: () => QueryClient;
15
+ }
16
+ export declare function setupCache(queryClient: QueryClient): CacheApi;
package/dist/cache.js ADDED
@@ -0,0 +1,17 @@
1
+ import { setupMutation } from './mutation';
2
+ import { setupQuery } from './query';
3
+ export function setupCache(queryClient) {
4
+ return {
5
+ createMutation: setupMutation(queryClient),
6
+ createQuery: setupQuery(queryClient),
7
+ cancelQueries: queryClient.cancelQueries.bind(queryClient),
8
+ getQueryData: queryClient.getQueryData.bind(queryClient),
9
+ invalidateQueries: queryClient.invalidateQueries.bind(queryClient),
10
+ refetchQueries: queryClient.refetchQueries.bind(queryClient),
11
+ removeQueries: queryClient.removeQueries.bind(queryClient),
12
+ resetQueries: queryClient.resetQueries.bind(queryClient),
13
+ setQueryData: queryClient.setQueryData.bind(queryClient),
14
+ unsafe_getClient: () => queryClient,
15
+ };
16
+ }
17
+ //# sourceMappingURL=cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cache.js","sourceRoot":"","sources":["../src/cache.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAoB,UAAU,EAAE,MAAM,SAAS,CAAC;AAevD,MAAM,UAAU,UAAU,CAAC,WAAwB;IACjD,OAAO;QACL,cAAc,EAAE,aAAa,CAAC,WAAW,CAAC;QAC1C,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC;QACpC,aAAa,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1D,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;QACxD,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;QAClE,cAAc,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;QAC5D,aAAa,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1D,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;QACxD,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;QACxD,gBAAgB,EAAE,GAAG,EAAE,CAAC,WAAW;KACpC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export * from './mutation';
2
+ export * from './query';
3
+ export * from './cache';
package/dist/index.js ADDED
@@ -0,0 +1,4 @@
1
+ export * from './mutation';
2
+ export * from './query';
3
+ export * from './cache';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type MutationFunction, type MutateOptions, type MutationObserverOptions, type MutationObserverResult, type MutationStatus as TanstackMutationStatus, type QueryClient } from '@tanstack/query-core';
2
+ export type MutationStatus = TanstackMutationStatus;
3
+ export interface MutationServiceSnapshot<TData = unknown, TError = Error, TVariables = void> {
4
+ data: TData | undefined;
5
+ error: TError | null;
6
+ status: MutationStatus;
7
+ variables: TVariables | undefined;
8
+ isError: boolean;
9
+ isIdle: boolean;
10
+ isPending: boolean;
11
+ isSuccess: boolean;
12
+ }
13
+ export interface MutationService<TData = unknown, TError = Error, TVariables = void, TOnMutateResult = unknown> {
14
+ getSnapshot: () => MutationServiceSnapshot<TData, TError, TVariables>;
15
+ subscribe: (listener: (snapshot: MutationServiceSnapshot<TData, TError, TVariables>) => void) => () => void;
16
+ mutate: (variables: TVariables, options?: MutateOptions<TData, TError, TVariables, TOnMutateResult>) => Promise<TData>;
17
+ reset: () => void;
18
+ unsafe_getResult: () => MutationObserverResult<TData, TError, TVariables, TOnMutateResult>;
19
+ }
20
+ export type MutationServiceOptions<TData = unknown, TError = Error, TVariables = void, TOnMutateResult = unknown> = Omit<MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationFn'>;
21
+ export interface CreateMutation {
22
+ <TData = unknown, TError = Error, TVariables = void, TOnMutateResult = unknown>(mutationFn: MutationFunction<TData, TVariables>, options?: MutationServiceOptions<TData, TError, TVariables, TOnMutateResult>): MutationService<TData, TError, TVariables, TOnMutateResult>;
23
+ }
24
+ export declare function setupMutation(queryClient: QueryClient): CreateMutation;
@@ -0,0 +1,31 @@
1
+ import { MutationObserver, } from '@tanstack/query-core';
2
+ export function setupMutation(queryClient) {
3
+ return function createMutation(mutationFn, options) {
4
+ const observer = new MutationObserver(queryClient, {
5
+ ...options,
6
+ mutationFn,
7
+ });
8
+ return {
9
+ getSnapshot: () => toMutationServiceSnapshot(observer.getCurrentResult()),
10
+ subscribe: (listener) => observer.subscribe((result) => {
11
+ listener(toMutationServiceSnapshot(result));
12
+ }),
13
+ mutate: (variables, mutateOptions) => observer.mutate(variables, mutateOptions),
14
+ reset: () => observer.reset(),
15
+ unsafe_getResult: () => observer.getCurrentResult(),
16
+ };
17
+ };
18
+ }
19
+ function toMutationServiceSnapshot(result) {
20
+ return {
21
+ data: result.data,
22
+ error: result.error,
23
+ status: result.status,
24
+ variables: result.variables,
25
+ isError: result.isError,
26
+ isIdle: result.isIdle,
27
+ isPending: result.isPending,
28
+ isSuccess: result.isSuccess,
29
+ };
30
+ }
31
+ //# sourceMappingURL=mutation-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation-service.js","sourceRoot":"","sources":["../src/mutation-service.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAOjB,MAAM,sBAAsB,CAAC;AA+C9B,MAAM,UAAU,aAAa,CAAC,WAAwB;IACpD,OAAO,SAAS,cAAc,CAM5B,UAA+C,EAC/C,OAA4E;QAE5E,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CACnC,WAAW,EACX;YACE,GAAG,OAAO;YACV,UAAU;SACX,CACF,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACzE,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CACtB,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5B,QAAQ,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9C,CAAC,CAAC;YACJ,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC;YAC/E,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;YAC7B,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE;SACpD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,MAA0E;IAE1E,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { type MutationFunction, type MutateOptions, type MutationObserverOptions, type MutationObserverResult, type MutationStatus as TanstackMutationStatus, type QueryClient } from '@tanstack/query-core';
2
+ export type MutationStatus = TanstackMutationStatus;
3
+ export interface MutationServiceSnapshot<TData = unknown, TError = Error, TVariables = void> {
4
+ data: TData | undefined;
5
+ error: TError | null;
6
+ status: MutationStatus;
7
+ variables: TVariables | undefined;
8
+ isError: boolean;
9
+ isIdle: boolean;
10
+ isPending: boolean;
11
+ isSuccess: boolean;
12
+ }
13
+ export interface MutationService<TData = unknown, TError = Error, TVariables = void, TOnMutateResult = unknown> {
14
+ getSnapshot: () => MutationServiceSnapshot<TData, TError, TVariables>;
15
+ subscribe: (listener: (snapshot: MutationServiceSnapshot<TData, TError, TVariables>) => void) => () => void;
16
+ mutate: (variables: TVariables, options?: MutateOptions<TData, TError, TVariables, TOnMutateResult>) => Promise<TData>;
17
+ reset: () => void;
18
+ unsafe_getResult: () => MutationObserverResult<TData, TError, TVariables, TOnMutateResult>;
19
+ }
20
+ export type MutationServiceOptions<TData = unknown, TError = Error, TVariables = void, TOnMutateResult = unknown> = Omit<MutationObserverOptions<TData, TError, TVariables, TOnMutateResult>, 'mutationFn'>;
21
+ export interface CreateMutation {
22
+ <TData = unknown, TError = Error, TVariables = void, TOnMutateResult = unknown>(mutationFn: MutationFunction<TData, TVariables>, options?: MutationServiceOptions<TData, TError, TVariables, TOnMutateResult>): MutationService<TData, TError, TVariables, TOnMutateResult>;
23
+ }
24
+ export declare function setupMutation(queryClient: QueryClient): CreateMutation;
@@ -0,0 +1,31 @@
1
+ import { MutationObserver, } from '@tanstack/query-core';
2
+ export function setupMutation(queryClient) {
3
+ return function createMutation(mutationFn, options) {
4
+ const observer = new MutationObserver(queryClient, {
5
+ ...options,
6
+ mutationFn,
7
+ });
8
+ return {
9
+ getSnapshot: () => toMutationServiceSnapshot(observer.getCurrentResult()),
10
+ subscribe: (listener) => observer.subscribe((result) => {
11
+ listener(toMutationServiceSnapshot(result));
12
+ }),
13
+ mutate: (variables, mutateOptions) => observer.mutate(variables, mutateOptions),
14
+ reset: () => observer.reset(),
15
+ unsafe_getResult: () => observer.getCurrentResult(),
16
+ };
17
+ };
18
+ }
19
+ function toMutationServiceSnapshot(result) {
20
+ return {
21
+ data: result.data,
22
+ error: result.error,
23
+ status: result.status,
24
+ variables: result.variables,
25
+ isError: result.isError,
26
+ isIdle: result.isIdle,
27
+ isPending: result.isPending,
28
+ isSuccess: result.isSuccess,
29
+ };
30
+ }
31
+ //# sourceMappingURL=mutation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mutation.js","sourceRoot":"","sources":["../src/mutation.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAOjB,MAAM,sBAAsB,CAAC;AA+C9B,MAAM,UAAU,aAAa,CAAC,WAAwB;IACpD,OAAO,SAAS,cAAc,CAM5B,UAA+C,EAC/C,OAA4E;QAE5E,MAAM,QAAQ,GAAG,IAAI,gBAAgB,CACnC,WAAW,EACX;YACE,GAAG,OAAO;YACV,UAAU;SACX,CACF,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,CAAC,yBAAyB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACzE,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CACtB,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5B,QAAQ,CAAC,yBAAyB,CAAC,MAAM,CAAC,CAAC,CAAC;YAC9C,CAAC,CAAC;YACJ,MAAM,EAAE,CAAC,SAAS,EAAE,aAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC;YAC/E,KAAK,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE;YAC7B,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE;SACpD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,yBAAyB,CAChC,MAA0E;IAE1E,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type FetchStatus, type InvalidateOptions, type InvalidateQueryFilters, type QueryClient, type QueryFunction, type QueryKey, type QueryObserverOptions, type QueryObserverResult, type RefetchOptions, type QueryStatus as TanstackQueryStatus } from '@tanstack/query-core';
2
+ export type QueryFetchStatus = FetchStatus;
3
+ export type QueryStatus = TanstackQueryStatus;
4
+ export interface QueryServiceSnapshot<TData, TError> {
5
+ data: TData | undefined;
6
+ error: TError | null;
7
+ fetchStatus: QueryFetchStatus;
8
+ status: QueryStatus;
9
+ isError: boolean;
10
+ isFetching: boolean;
11
+ isPending: boolean;
12
+ isSuccess: boolean;
13
+ }
14
+ export interface QueryMetaState {
15
+ fetchStatus: QueryFetchStatus;
16
+ status: QueryStatus;
17
+ }
18
+ export interface QueryService<TData, TError> {
19
+ getSnapshot: () => QueryServiceSnapshot<TData, TError>;
20
+ subscribe: (listener: (snapshot: QueryServiceSnapshot<TData, TError>) => void) => () => void;
21
+ refetch: (options?: RefetchOptions) => Promise<QueryServiceSnapshot<TData, TError>>;
22
+ invalidate: (options?: QueryInvalidateOptions) => Promise<void>;
23
+ unsafe_getResult: () => QueryObserverResult<TData, TError>;
24
+ }
25
+ export interface QueryInvalidateOptions extends Pick<InvalidateOptions, 'cancelRefetch' | 'throwOnError'>, Pick<InvalidateQueryFilters, 'refetchType'> {
26
+ }
27
+ export interface CreateQuery {
28
+ <TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: QueryServiceOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>): QueryService<TData, TError>;
29
+ }
30
+ export type QueryServiceOptions<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, 'queryFn' | 'queryKey'>;
31
+ export declare function toQueryMetaState<TData, TError>(snapshot: Pick<QueryServiceSnapshot<TData, TError>, 'fetchStatus' | 'status'>): QueryMetaState;
32
+ export declare function isQueryLoading(query: QueryMetaState): boolean;
33
+ export declare function setupQuery(queryClient: QueryClient): CreateQuery;
@@ -0,0 +1,55 @@
1
+ import { QueryObserver, } from '@tanstack/query-core';
2
+ export function toQueryMetaState(snapshot) {
3
+ return {
4
+ fetchStatus: snapshot.fetchStatus,
5
+ status: snapshot.status,
6
+ };
7
+ }
8
+ export function isQueryLoading(query) {
9
+ return query.status === 'pending' && query.fetchStatus === 'fetching';
10
+ }
11
+ export function setupQuery(queryClient) {
12
+ return function createQuery(queryKey, queryFn, options) {
13
+ const observer = new QueryObserver(queryClient, {
14
+ ...options,
15
+ queryFn,
16
+ queryKey,
17
+ });
18
+ return {
19
+ getSnapshot: () => toQueryServiceSnapshot(observer.getCurrentResult()),
20
+ subscribe: (listener) => observer.subscribe((result) => {
21
+ listener(toQueryServiceSnapshot(result));
22
+ }),
23
+ refetch: async (options) => toQueryServiceSnapshot(await observer.refetch(options)),
24
+ invalidate: (options) => queryClient.invalidateQueries({
25
+ exact: true,
26
+ queryKey,
27
+ ...(options?.refetchType === undefined ? {} : { refetchType: options.refetchType }),
28
+ }, toInvalidateOptions(options)),
29
+ unsafe_getResult: () => observer.getCurrentResult(),
30
+ };
31
+ };
32
+ }
33
+ function toQueryServiceSnapshot(result) {
34
+ return {
35
+ data: result.data,
36
+ error: result.error,
37
+ fetchStatus: result.fetchStatus,
38
+ status: result.status,
39
+ isError: result.isError,
40
+ isFetching: result.isFetching,
41
+ isPending: result.isPending,
42
+ isSuccess: result.isSuccess,
43
+ };
44
+ }
45
+ function toInvalidateOptions(options) {
46
+ if (options === undefined) {
47
+ return undefined;
48
+ }
49
+ const invalidateOptions = {
50
+ ...(options.cancelRefetch === undefined ? {} : { cancelRefetch: options.cancelRefetch }),
51
+ ...(options.throwOnError === undefined ? {} : { throwOnError: options.throwOnError }),
52
+ };
53
+ return Object.keys(invalidateOptions).length > 0 ? invalidateOptions : undefined;
54
+ }
55
+ //# sourceMappingURL=query-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query-service.js","sourceRoot":"","sources":["../src/query-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,aAAa,GAKd,MAAM,sBAAsB,CAAC;AA0D9B,MAAM,UAAU,gBAAgB,CAC9B,QAA6E;IAE7E,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAwB;IACjD,OAAO,SAAS,WAAW,CAOzB,QAAmB,EACnB,OAA+C,EAC/C,OAAiF;QAEjF,MAAM,QAAQ,GAAG,IAAI,aAAa,CAChC,WAAW,EACX;YACE,GAAG,OAAO;YACV,OAAO;YACP,QAAQ;SACT,CACF,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACtE,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CACtB,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5B,QAAQ,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC;YACJ,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnF,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CACtB,WAAW,CAAC,iBAAiB,CAC3B;gBACE,KAAK,EAAE,IAAI;gBACX,QAAQ;gBACR,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;aACpF,EACD,mBAAmB,CAAC,OAAO,CAAC,CAC7B;YACH,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE;SACpD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAA0C;IAE1C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IAC3D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,iBAAiB,GAAsB;QAC3C,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QACxF,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;KACtF,CAAC;IAEF,OAAO,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC"}
@@ -0,0 +1,33 @@
1
+ import { type FetchStatus, type InvalidateOptions, type InvalidateQueryFilters, type QueryClient, type QueryFunction, type QueryKey, type QueryObserverOptions, type QueryObserverResult, type RefetchOptions, type QueryStatus as TanstackQueryStatus } from '@tanstack/query-core';
2
+ export type QueryFetchStatus = FetchStatus;
3
+ export type QueryStatus = TanstackQueryStatus;
4
+ export interface QueryServiceSnapshot<TData, TError> {
5
+ data: TData | undefined;
6
+ error: TError | null;
7
+ fetchStatus: QueryFetchStatus;
8
+ status: QueryStatus;
9
+ isError: boolean;
10
+ isFetching: boolean;
11
+ isPending: boolean;
12
+ isSuccess: boolean;
13
+ }
14
+ export interface QueryMetaState {
15
+ fetchStatus: QueryFetchStatus;
16
+ status: QueryStatus;
17
+ }
18
+ export interface QueryService<TData, TError> {
19
+ getSnapshot: () => QueryServiceSnapshot<TData, TError>;
20
+ subscribe: (listener: (snapshot: QueryServiceSnapshot<TData, TError>) => void) => () => void;
21
+ refetch: (options?: RefetchOptions) => Promise<QueryServiceSnapshot<TData, TError>>;
22
+ invalidate: (options?: QueryInvalidateOptions) => Promise<void>;
23
+ unsafe_getResult: () => QueryObserverResult<TData, TError>;
24
+ }
25
+ export interface QueryInvalidateOptions extends Pick<InvalidateOptions, 'cancelRefetch' | 'throwOnError'>, Pick<InvalidateQueryFilters, 'refetchType'> {
26
+ }
27
+ export interface CreateQuery {
28
+ <TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey>(queryKey: TQueryKey, queryFn: QueryFunction<TQueryFnData, TQueryKey>, options?: QueryServiceOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>): QueryService<TData, TError>;
29
+ }
30
+ export type QueryServiceOptions<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryData = TQueryFnData, TQueryKey extends QueryKey = QueryKey> = Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryData, TQueryKey>, 'queryFn' | 'queryKey'>;
31
+ export declare function toQueryMetaState<TData, TError>(snapshot: Pick<QueryServiceSnapshot<TData, TError>, 'fetchStatus' | 'status'>): QueryMetaState;
32
+ export declare function isQueryLoading(query: QueryMetaState): boolean;
33
+ export declare function setupQuery(queryClient: QueryClient): CreateQuery;
package/dist/query.js ADDED
@@ -0,0 +1,55 @@
1
+ import { QueryObserver, } from '@tanstack/query-core';
2
+ export function toQueryMetaState(snapshot) {
3
+ return {
4
+ fetchStatus: snapshot.fetchStatus,
5
+ status: snapshot.status,
6
+ };
7
+ }
8
+ export function isQueryLoading(query) {
9
+ return query.status === 'pending' && query.fetchStatus === 'fetching';
10
+ }
11
+ export function setupQuery(queryClient) {
12
+ return function createQuery(queryKey, queryFn, options) {
13
+ const observer = new QueryObserver(queryClient, {
14
+ ...options,
15
+ queryFn,
16
+ queryKey,
17
+ });
18
+ return {
19
+ getSnapshot: () => toQueryServiceSnapshot(observer.getCurrentResult()),
20
+ subscribe: (listener) => observer.subscribe((result) => {
21
+ listener(toQueryServiceSnapshot(result));
22
+ }),
23
+ refetch: async (options) => toQueryServiceSnapshot(await observer.refetch(options)),
24
+ invalidate: (options) => queryClient.invalidateQueries({
25
+ exact: true,
26
+ queryKey,
27
+ ...(options?.refetchType === undefined ? {} : { refetchType: options.refetchType }),
28
+ }, toInvalidateOptions(options)),
29
+ unsafe_getResult: () => observer.getCurrentResult(),
30
+ };
31
+ };
32
+ }
33
+ function toQueryServiceSnapshot(result) {
34
+ return {
35
+ data: result.data,
36
+ error: result.error,
37
+ fetchStatus: result.fetchStatus,
38
+ status: result.status,
39
+ isError: result.isError,
40
+ isFetching: result.isFetching,
41
+ isPending: result.isPending,
42
+ isSuccess: result.isSuccess,
43
+ };
44
+ }
45
+ function toInvalidateOptions(options) {
46
+ if (options === undefined) {
47
+ return undefined;
48
+ }
49
+ const invalidateOptions = {
50
+ ...(options.cancelRefetch === undefined ? {} : { cancelRefetch: options.cancelRefetch }),
51
+ ...(options.throwOnError === undefined ? {} : { throwOnError: options.throwOnError }),
52
+ };
53
+ return Object.keys(invalidateOptions).length > 0 ? invalidateOptions : undefined;
54
+ }
55
+ //# sourceMappingURL=query.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../src/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAOL,aAAa,GAKd,MAAM,sBAAsB,CAAC;AA0D9B,MAAM,UAAU,gBAAgB,CAC9B,QAA6E;IAE7E,OAAO;QACL,WAAW,EAAE,QAAQ,CAAC,WAAW;QACjC,MAAM,EAAE,QAAQ,CAAC,MAAM;KACxB,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,KAAqB;IAClD,OAAO,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,WAAW,KAAK,UAAU,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,WAAwB;IACjD,OAAO,SAAS,WAAW,CAOzB,QAAmB,EACnB,OAA+C,EAC/C,OAAiF;QAEjF,MAAM,QAAQ,GAAG,IAAI,aAAa,CAChC,WAAW,EACX;YACE,GAAG,OAAO;YACV,OAAO;YACP,QAAQ;SACT,CACF,CAAC;QAEF,OAAO;YACL,WAAW,EAAE,GAAG,EAAE,CAAC,sBAAsB,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CAAC;YACtE,SAAS,EAAE,CAAC,QAAQ,EAAE,EAAE,CACtB,QAAQ,CAAC,SAAS,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5B,QAAQ,CAAC,sBAAsB,CAAC,MAAM,CAAC,CAAC,CAAC;YAC3C,CAAC,CAAC;YACJ,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,MAAM,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YACnF,UAAU,EAAE,CAAC,OAAO,EAAE,EAAE,CACtB,WAAW,CAAC,iBAAiB,CAC3B;gBACE,KAAK,EAAE,IAAI;gBACX,QAAQ;gBACR,GAAG,CAAC,OAAO,EAAE,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;aACpF,EACD,mBAAmB,CAAC,OAAO,CAAC,CAC7B;YACH,gBAAgB,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE;SACpD,CAAC;IACJ,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,sBAAsB,CAC7B,MAA0C;IAE1C,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,UAAU,EAAE,MAAM,CAAC,UAAU;QAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,SAAS,EAAE,MAAM,CAAC,SAAS;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,mBAAmB,CAAC,OAAgC;IAC3D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,iBAAiB,GAAsB;QAC3C,GAAG,CAAC,OAAO,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,OAAO,CAAC,aAAa,EAAE,CAAC;QACxF,GAAG,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,OAAO,CAAC,YAAY,EAAE,CAAC;KACtF,CAAC;IAEF,OAAO,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type QueryClient } from '@tanstack/query-core';
2
+ import { type CreateMutation } from './mutation';
3
+ import { type CreateQuery } from './query';
4
+ export interface QueryRuntime {
5
+ createMutation: CreateMutation;
6
+ createQuery: CreateQuery;
7
+ cancelQueries: QueryClient['cancelQueries'];
8
+ getQueryData: QueryClient['getQueryData'];
9
+ invalidateQueries: QueryClient['invalidateQueries'];
10
+ refetchQueries: QueryClient['refetchQueries'];
11
+ removeQueries: QueryClient['removeQueries'];
12
+ resetQueries: QueryClient['resetQueries'];
13
+ setQueryData: QueryClient['setQueryData'];
14
+ unsafe_getClient: () => QueryClient;
15
+ }
16
+ export declare function setupQueryRuntime(queryClient: QueryClient): QueryRuntime;
@@ -0,0 +1,17 @@
1
+ import { setupMutation } from './mutation';
2
+ import { setupQuery } from './query';
3
+ export function setupQueryRuntime(queryClient) {
4
+ return {
5
+ createMutation: setupMutation(queryClient),
6
+ createQuery: setupQuery(queryClient),
7
+ cancelQueries: queryClient.cancelQueries.bind(queryClient),
8
+ getQueryData: queryClient.getQueryData.bind(queryClient),
9
+ invalidateQueries: queryClient.invalidateQueries.bind(queryClient),
10
+ refetchQueries: queryClient.refetchQueries.bind(queryClient),
11
+ removeQueries: queryClient.removeQueries.bind(queryClient),
12
+ resetQueries: queryClient.resetQueries.bind(queryClient),
13
+ setQueryData: queryClient.setQueryData.bind(queryClient),
14
+ unsafe_getClient: () => queryClient,
15
+ };
16
+ }
17
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAIA,OAAO,EAAuB,aAAa,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAoB,UAAU,EAAE,MAAM,SAAS,CAAC;AAevD,MAAM,UAAU,iBAAiB,CAAC,WAAwB;IACxD,OAAO;QACL,cAAc,EAAE,aAAa,CAAC,WAAW,CAAC;QAC1C,WAAW,EAAE,UAAU,CAAC,WAAW,CAAC;QACpC,aAAa,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1D,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;QACxD,iBAAiB,EAAE,WAAW,CAAC,iBAAiB,CAAC,IAAI,CAAC,WAAW,CAAC;QAClE,cAAc,EAAE,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC;QAC5D,aAAa,EAAE,WAAW,CAAC,aAAa,CAAC,IAAI,CAAC,WAAW,CAAC;QAC1D,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;QACxD,YAAY,EAAE,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC;QACxD,gBAAgB,EAAE,GAAG,EAAE,CAAC,WAAW;KACpC,CAAC;AACJ,CAAC"}