katanakit-js 4.0.2 → 4.0.3

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 (54) hide show
  1. package/README.md +54 -55
  2. package/dist/adapters/angular/index.d.ts +1 -0
  3. package/dist/adapters/angular/index.d.ts.map +1 -1
  4. package/dist/adapters/angular/index.js +1 -0
  5. package/dist/adapters/angular/index.js.map +1 -1
  6. package/dist/adapters/angular/query.d.ts +56 -73
  7. package/dist/adapters/angular/query.d.ts.map +1 -1
  8. package/dist/adapters/angular/query.js +66 -129
  9. package/dist/adapters/angular/query.js.map +1 -1
  10. package/dist/adapters/react/index.d.ts +1 -0
  11. package/dist/adapters/react/index.d.ts.map +1 -1
  12. package/dist/adapters/react/index.js +1 -0
  13. package/dist/adapters/react/index.js.map +1 -1
  14. package/dist/adapters/react/query.d.ts +27 -72
  15. package/dist/adapters/react/query.d.ts.map +1 -1
  16. package/dist/adapters/react/query.js +51 -165
  17. package/dist/adapters/react/query.js.map +1 -1
  18. package/dist/adapters/solid/index.d.ts +1 -0
  19. package/dist/adapters/solid/index.d.ts.map +1 -1
  20. package/dist/adapters/solid/index.js +1 -0
  21. package/dist/adapters/solid/index.js.map +1 -1
  22. package/dist/adapters/solid/query.d.ts +32 -74
  23. package/dist/adapters/solid/query.d.ts.map +1 -1
  24. package/dist/adapters/solid/query.js +56 -131
  25. package/dist/adapters/solid/query.js.map +1 -1
  26. package/dist/adapters/svelte/index.d.ts +1 -0
  27. package/dist/adapters/svelte/index.d.ts.map +1 -1
  28. package/dist/adapters/svelte/index.js +1 -0
  29. package/dist/adapters/svelte/index.js.map +1 -1
  30. package/dist/adapters/svelte/query.d.ts +24 -72
  31. package/dist/adapters/svelte/query.d.ts.map +1 -1
  32. package/dist/adapters/svelte/query.js +41 -135
  33. package/dist/adapters/svelte/query.js.map +1 -1
  34. package/dist/adapters/vanilla/index.d.ts +3 -0
  35. package/dist/adapters/vanilla/index.d.ts.map +1 -0
  36. package/dist/adapters/vanilla/index.js +3 -0
  37. package/dist/adapters/vanilla/index.js.map +1 -0
  38. package/dist/adapters/vanilla/query.d.ts +69 -0
  39. package/dist/adapters/vanilla/query.d.ts.map +1 -0
  40. package/dist/adapters/vanilla/query.js +76 -0
  41. package/dist/adapters/vanilla/query.js.map +1 -0
  42. package/dist/adapters/vue/index.d.ts +1 -0
  43. package/dist/adapters/vue/index.d.ts.map +1 -1
  44. package/dist/adapters/vue/index.js +1 -0
  45. package/dist/adapters/vue/index.js.map +1 -1
  46. package/dist/adapters/vue/query.d.ts +35 -86
  47. package/dist/adapters/vue/query.d.ts.map +1 -1
  48. package/dist/adapters/vue/query.js +57 -168
  49. package/dist/adapters/vue/query.js.map +1 -1
  50. package/dist/core/services/query.service.d.ts +87 -134
  51. package/dist/core/services/query.service.d.ts.map +1 -1
  52. package/dist/core/services/query.service.js +99 -378
  53. package/dist/core/services/query.service.js.map +1 -1
  54. package/package.json +10 -3
@@ -1,119 +1,62 @@
1
- import { useCallback, useEffect, useState } from "react";
2
- import { useQueryClient, } from "../../core/services/query.service.js";
3
- const IDLE_STATE = {
4
- status: "idle",
5
- data: null,
6
- error: null,
7
- isLoading: false,
8
- isSuccess: false,
9
- isError: false,
10
- isStale: true,
11
- dataUpdatedAt: 0,
12
- errorUpdatedAt: 0,
13
- fetchCount: 0,
14
- };
1
+ import { MutationObserver, notifyManager, QueryObserver, } from "@tanstack/query-core";
2
+ import { useCallback, useEffect, useState, useSyncExternalStore } from "react";
3
+ import { useQueryClient } from "../../core/services/query.service.js";
15
4
  /**
16
- * React hook that wraps the {@link QueryClient} with `useState` reactivity.
17
- * Integrates with the API manager — your `queryFn` typically calls `useGetApi`
18
- * or `useFetch` and returns the Safe Result.
5
+ * React hook for a cached query, backed by TanStack Query Core.
19
6
  *
20
- * Subscribes to the global query cache, refetches when the serialized
21
- * `queryKey` changes, and unsubscribes on unmount.
7
+ * Returns TanStack's native {@link QueryObserverResult}
8
+ * (`{ data, error, isPending, isFetching, isSuccess, isError, status, fetchStatus, refetch, … }`),
9
+ * with stale-while-revalidate, focus/reconnect refetch, retries and garbage
10
+ * collection handled by the engine.
22
11
  *
23
- * @param config - Query configuration.
24
- * @param client - Optional QueryClient instance (uses global singleton by default).
25
- * @returns `{ data, error, isLoading, isSuccess, isError, isStale, status, refetch }`.
12
+ * `client` is captured for the component's lifetime — pass a stable instance.
13
+ *
14
+ * @param options - TanStack query options (`queryKey`, `queryFn`, `staleTime`, …).
15
+ * @param client - Optional {@link QueryClient} (defaults to the shared singleton).
16
+ * @returns The TanStack {@link QueryObserverResult}.
26
17
  *
27
18
  * @example
28
19
  * ```tsx
29
- * import { useQuery } from "katanakit-js/adapters/react";
20
+ * import { useQuery, useSafeQueryFn } from "katanakit-js/adapters/react";
30
21
  * import { useGetApi } from "katanakit-js";
31
22
  *
32
23
  * function Pokemon({ id }: { id: number }) {
33
- * const { data, isLoading, error } = useQuery({
24
+ * const { data, isPending, isError, error } = useQuery({
34
25
  * queryKey: ["pokemon", id],
35
- * queryFn: () => useGetApi("pokeapi", "pokemonById", { params: { id } }),
26
+ * queryFn: useSafeQueryFn(() => useGetApi("pokeapi", "pokemonById", { params: { id } })),
36
27
  * });
37
- * if (isLoading) return <div>Loading…</div>;
38
- * if (error) return <div>{error.message}</div>;
28
+ * if (isPending) return <div>Loading…</div>;
29
+ * if (isError) return <div>{error.message}</div>;
39
30
  * return <div>{data?.name}</div>;
40
31
  * }
41
32
  * ```
42
33
  */
43
- export function useQuery(config, client) {
44
- const qc = client ?? useQueryClient();
45
- const [state, setState] = useState(IDLE_STATE);
46
- // Serialize the key so React's dependency comparison tracks deep changes.
47
- const keyHash = JSON.stringify(config.queryKey);
34
+ export function useQuery(options, client) {
35
+ const queryClient = client ?? useQueryClient();
36
+ const defaultedOptions = queryClient.defaultQueryOptions(options);
37
+ const [observer] = useState(() => new QueryObserver(queryClient, defaultedOptions));
38
+ const subscribe = useCallback((onStoreChange) => {
39
+ const unsubscribe = observer.subscribe(notifyManager.batchCalls(onStoreChange));
40
+ // Sync the optimistic result with the store after subscribing.
41
+ observer.updateResult();
42
+ return unsubscribe;
43
+ }, [observer]);
44
+ const result = useSyncExternalStore(subscribe, () => observer.getCurrentResult(), () => observer.getCurrentResult());
45
+ // Keep the observer's options in sync on every render (TanStack's pattern).
48
46
  useEffect(() => {
49
- let disposed = false;
50
- const qKey = config.queryKey;
51
- setState(IDLE_STATE);
52
- const unsubscribe = qc.subscribe(qKey, (next) => {
53
- if (!disposed)
54
- setState(next);
55
- });
56
- const existing = qc.getQueryState(qKey);
57
- if (existing)
58
- setState(existing);
59
- if (config.enabled !== false) {
60
- void qc
61
- .fetchQuery({
62
- queryKey: qKey,
63
- queryFn: config.queryFn,
64
- staleTime: config.staleTime,
65
- cacheTime: config.cacheTime,
66
- retry: config.retry,
67
- retryDelay: config.retryDelay,
68
- })
69
- .catch(() => {
70
- // Error is already reflected in the cache state.
71
- });
72
- }
73
- return () => {
74
- disposed = true;
75
- unsubscribe();
76
- };
77
- }, [keyHash, config.enabled]);
78
- const refetch = useCallback(async () => {
79
- await qc
80
- .fetchQuery({
81
- queryKey: config.queryKey,
82
- queryFn: config.queryFn,
83
- staleTime: 0,
84
- cacheTime: config.cacheTime,
85
- retry: config.retry,
86
- retryDelay: config.retryDelay,
87
- })
88
- .catch(() => {
89
- // Error is already reflected in the cache state.
90
- });
91
- }, [qc, keyHash]);
92
- return {
93
- data: state.data,
94
- error: state.error,
95
- isLoading: state.isLoading,
96
- isSuccess: state.isSuccess,
97
- isError: state.isError,
98
- isStale: state.isStale,
99
- status: state.status,
100
- refetch,
101
- };
47
+ observer.setOptions(queryClient.defaultQueryOptions(options));
48
+ });
49
+ return result;
102
50
  }
103
- const IDLE_MUTATION_STATE = {
104
- data: null,
105
- error: null,
106
- isLoading: false,
107
- isSuccess: false,
108
- isError: false,
109
- status: "idle",
110
- };
111
51
  /**
112
- * React hook for mutations (POST/PUT/PATCH/DELETE).
113
- * Does not cache — returns a `mutate` function that executes the mutation.
52
+ * React hook for a mutation, backed by TanStack Query Core.
53
+ *
54
+ * Returns TanStack's native {@link MutationObserverResult}
55
+ * (`{ data, error, variables, isPending, isError, isSuccess, status, mutate, reset }`).
114
56
  *
115
- * @param config - Mutation configuration.
116
- * @returns `{ data, error, isLoading, isSuccess, isError, status, mutate, reset }`.
57
+ * @param options - TanStack mutation options (`mutationFn`, `onSuccess`, …).
58
+ * @param client - Optional {@link QueryClient} (defaults to the shared singleton).
59
+ * @returns The TanStack {@link MutationObserverResult}.
117
60
  *
118
61
  * @example
119
62
  * ```tsx
@@ -122,79 +65,22 @@ const IDLE_MUTATION_STATE = {
122
65
  *
123
66
  * function CreateUser() {
124
67
  * const qc = useQueryClient();
125
- * const { mutate, isLoading } = useMutation({
68
+ * const { mutate, isPending } = useMutation({
126
69
  * mutationFn: (name: string) => usePost("api", "createUser", { name }),
127
70
  * onSuccess: () => qc.invalidateQueries({ queryKey: ["users"] }),
128
71
  * });
129
- * return <button disabled={isLoading} onClick={() => mutate("Ada")}>Create</button>;
72
+ * return <button disabled={isPending} onClick={() => mutate("Ada")}>Create</button>;
130
73
  * }
131
74
  * ```
132
75
  */
133
- export function useMutation(config) {
134
- const [state, setState] = useState(IDLE_MUTATION_STATE);
135
- const mutate = useCallback(async (variables) => {
136
- setState((prev) => ({
137
- ...prev,
138
- isLoading: true,
139
- isSuccess: false,
140
- isError: false,
141
- status: "loading",
142
- }));
143
- try {
144
- const result = await config.mutationFn(variables);
145
- if (result.ok) {
146
- setState({
147
- data: result.data,
148
- error: null,
149
- isLoading: false,
150
- isSuccess: true,
151
- isError: false,
152
- status: "success",
153
- });
154
- config.onSuccess?.(result.data, variables);
155
- config.onSettled?.(result.data, null, variables);
156
- }
157
- else {
158
- setState({
159
- data: null,
160
- error: result.error,
161
- isLoading: false,
162
- isSuccess: false,
163
- isError: true,
164
- status: "error",
165
- });
166
- config.onError?.(result.error, variables);
167
- config.onSettled?.(null, result.error, variables);
168
- }
169
- }
170
- catch (error) {
171
- const apiError = error instanceof Error
172
- ? { message: error.message, status: 0 }
173
- : { message: String(error), status: 0 };
174
- setState({
175
- data: null,
176
- error: apiError,
177
- isLoading: false,
178
- isSuccess: false,
179
- isError: true,
180
- status: "error",
181
- });
182
- config.onError?.(apiError, variables);
183
- config.onSettled?.(null, apiError, variables);
184
- }
185
- }, []);
186
- const reset = useCallback(() => {
187
- setState(IDLE_MUTATION_STATE);
188
- }, []);
189
- return {
190
- data: state.data,
191
- error: state.error,
192
- isLoading: state.isLoading,
193
- isSuccess: state.isSuccess,
194
- isError: state.isError,
195
- status: state.status,
196
- mutate,
197
- reset,
198
- };
76
+ export function useMutation(options, client) {
77
+ const queryClient = client ?? useQueryClient();
78
+ const [observer] = useState(() => new MutationObserver(queryClient, options));
79
+ const subscribe = useCallback((onStoreChange) => observer.subscribe(notifyManager.batchCalls(onStoreChange)), [observer]);
80
+ const result = useSyncExternalStore(subscribe, () => observer.getCurrentResult(), () => observer.getCurrentResult());
81
+ useEffect(() => {
82
+ observer.setOptions(options);
83
+ });
84
+ return result;
199
85
  }
200
86
  //# sourceMappingURL=query.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/adapters/react/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.js","sourceRoot":"","sources":["../../../src/adapters/react/query.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,gBAAgB,EAGhB,aAAa,EAEb,aAAa,GAGb,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,QAAQ,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAC;AAE/E,OAAO,EAAE,cAAc,EAAE,MAAM,sCAAsC,CAAC;AAEtE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,UAAU,QAAQ,CACvB,OAA0D,EAC1D,MAAoB;IAEpB,MAAM,WAAW,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC;IAC/C,MAAM,gBAAgB,GAAG,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;IAElE,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,aAAa,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAEpF,MAAM,SAAS,GAAG,WAAW,CAC5B,CAAC,aAAyB,EAAE,EAAE;QAC7B,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC;QAChF,+DAA+D;QAC/D,QAAQ,CAAC,YAAY,EAAE,CAAC;QACxB,OAAO,WAAW,CAAC;IACpB,CAAC,EACD,CAAC,QAAQ,CAAC,CACV,CAAC;IAEF,MAAM,MAAM,GAAG,oBAAoB,CAClC,SAAS,EACT,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EACjC,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CACjC,CAAC;IAEF,4EAA4E;IAC5E,SAAS,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,WAAW,CAC1B,OAAqE,EACrE,MAAoB;IAEpB,MAAM,WAAW,GAAG,MAAM,IAAI,cAAc,EAAE,CAAC;IAE/C,MAAM,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,gBAAgB,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC,CAAC;IAE9E,MAAM,SAAS,GAAG,WAAW,CAC5B,CAAC,aAAyB,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,EAC1F,CAAC,QAAQ,CAAC,CACV,CAAC;IAEF,MAAM,MAAM,GAAG,oBAAoB,CAClC,SAAS,EACT,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,EACjC,GAAG,EAAE,CAAC,QAAQ,CAAC,gBAAgB,EAAE,CACjC,CAAC;IAEF,SAAS,CAAC,GAAG,EAAE;QACd,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,OAAO,MAAM,CAAC;AACf,CAAC"}
@@ -1,3 +1,4 @@
1
+ export { useCreateQueryClient, useInitQueryClient, useQueryClient, useSafeQueryFn, } from "../../core/services/query.service.js";
1
2
  export * from "./fetch.js";
2
3
  export * from "./query.js";
3
4
  export * from "./watch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/solid/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapters/solid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,cAAc,GACd,MAAM,sCAAsC,CAAC;AAC9C,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -1,3 +1,4 @@
1
+ export { useCreateQueryClient, useInitQueryClient, useQueryClient, useSafeQueryFn, } from "../../core/services/query.service.js";
1
2
  export * from "./fetch.js";
2
3
  export * from "./query.js";
3
4
  export * from "./watch.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/solid/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/adapters/solid/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,oBAAoB,EACpB,kBAAkB,EAClB,cAAc,EACd,cAAc,GACd,MAAM,sCAAsC,CAAC;AAC9C,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC"}
@@ -1,87 +1,45 @@
1
- import { type Signal } from "solid-js";
2
- import { type QueryClient, type QueryKey, type QueryState } from "../../core/services/query.service.js";
3
- import type { ApiError, FetchResult } from "../../types/index.js";
4
- /** Configuration for `useQuery` (Solid primitive). */
5
- export interface UseQueryConfig<T = unknown> {
6
- /** Cache key (stable array). */
7
- queryKey: QueryKey;
8
- /** Fetcher function returning a Safe Result. */
9
- queryFn: () => Promise<FetchResult<T>>;
10
- /** Time in ms before cached data is stale (default: 0). */
11
- staleTime?: number;
12
- /** Time in ms to keep unused data (default: 5 min). */
13
- cacheTime?: number;
14
- /** Retry count on failure (default: 3). */
15
- retry?: number;
16
- /** Base delay for exponential backoff (default: 1000). */
17
- retryDelay?: number;
18
- /** Whether the query is enabled (default: true). */
19
- enabled?: boolean;
20
- }
21
- /** Reactive return value of `useQuery` (Solid signals are accessors). */
22
- export interface UseQueryReturn<T = unknown> {
23
- data: Signal<T | null>[0];
24
- error: Signal<ApiError | null>[0];
25
- isLoading: Signal<boolean>[0];
26
- isSuccess: Signal<boolean>[0];
27
- isError: Signal<boolean>[0];
28
- isStale: Signal<boolean>[0];
29
- status: Signal<QueryState<T>["status"]>[0];
30
- /** Manually refetch the query. */
31
- refetch: () => Promise<void>;
32
- }
33
- /** Configuration for `useMutation`. */
34
- export interface UseMutationConfig<TData = unknown, TVariables = unknown> {
35
- mutationFn: (variables: TVariables) => Promise<FetchResult<TData>>;
36
- onSuccess?: (data: TData, variables: TVariables) => void;
37
- onError?: (error: ApiError, variables: TVariables) => void;
38
- onSettled?: (data: TData | null, error: ApiError | null, variables: TVariables) => void;
39
- }
40
- /** Reactive return value of `useMutation`. */
41
- export interface UseMutationReturn<TData = unknown, TVariables = unknown> {
42
- data: Signal<TData | null>[0];
43
- error: Signal<ApiError | null>[0];
44
- isLoading: Signal<boolean>[0];
45
- isSuccess: Signal<boolean>[0];
46
- isError: Signal<boolean>[0];
47
- status: Signal<"idle" | "loading" | "success" | "error">[0];
48
- /** Execute the mutation. */
49
- mutate: (variables: TVariables) => Promise<void>;
50
- /** Reset the mutation state. */
51
- reset: () => void;
52
- }
1
+ import { type MutationObserverOptions, type MutationObserverResult, type QueryClient, type QueryObserverOptions, type QueryObserverResult } from "@tanstack/query-core";
2
+ /** Options for the Solid binding: a plain object or a reactive getter. */
3
+ export type SolidQueryOptions<TQueryFnData, TError, TData> = QueryObserverOptions<TQueryFnData, TError, TData> | (() => QueryObserverOptions<TQueryFnData, TError, TData>);
53
4
  /**
54
- * Solid primitive that wraps the {@link QueryClient} with fine-grained signals.
55
- * Integrates with the API manager — your `queryFn` typically calls `useGetApi`
56
- * or `useFetch` and returns the Safe Result.
5
+ * Solid primitive for a cached query, backed by TanStack Query Core.
57
6
  *
58
- * @param config - Query configuration.
59
- * @param client - Optional QueryClient instance (uses global singleton by default).
60
- * @returns Signal accessors for `{ data, error, isLoading, isSuccess, isError, isStale, status }` plus `refetch`.
7
+ * Returns a reactive {@link QueryObserverResult} store — read `query.data`,
8
+ * `query.isPending`, `query.isError`, `query.status`, etc. directly. Pass a
9
+ * getter (`() => ({ queryKey, queryFn })`) to react to key changes.
10
+ *
11
+ * Call it inside a component or `createRoot` so `onCleanup` disposes the observer.
12
+ *
13
+ * @param options - TanStack query options, or a getter returning them.
14
+ * @param client - Optional {@link QueryClient} (defaults to the shared singleton).
15
+ * @returns A reactive {@link QueryObserverResult} store.
61
16
  *
62
17
  * @example
63
18
  * ```tsx
64
- * import { useQuery } from "katanakit-js/adapters/solid";
19
+ * import { Show } from "solid-js";
20
+ * import { useQuery, useSafeQueryFn } from "katanakit-js/adapters/solid";
65
21
  * import { useGetApi } from "katanakit-js";
66
22
  *
67
23
  * function Pokemon() {
68
- * const { data, isLoading, error } = useQuery({
24
+ * const query = useQuery(() => ({
69
25
  * queryKey: ["pokemon", 25],
70
- * queryFn: () => useGetApi("pokeapi", "pokemonById", { params: { id: 25 } }),
71
- * });
72
- * return <Show when={!isLoading() && !error()} fallback={<div>Loading…</div>}>
73
- * <div>{data()?.name}</div>
74
- * </Show>;
26
+ * queryFn: useSafeQueryFn(() => useGetApi("pokeapi", "pokemonById", { params: { id: 25 } })),
27
+ * }));
28
+ * return (
29
+ * <Show when={!query.isPending} fallback={<div>Loading…</div>}>
30
+ * <div>{query.data?.name}</div>
31
+ * </Show>
32
+ * );
75
33
  * }
76
34
  * ```
77
35
  */
78
- export declare function useQuery<T>(config: UseQueryConfig<T>, client?: QueryClient): UseQueryReturn<T>;
36
+ export declare function useQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData>(options: SolidQueryOptions<TQueryFnData, TError, TData>, client?: QueryClient): QueryObserverResult<TData, TError>;
79
37
  /**
80
- * Solid primitive for mutations (POST/PUT/PATCH/DELETE).
81
- * Does not cache — returns a `mutate` function that executes the mutation.
38
+ * Solid primitive for a mutation, backed by TanStack Query Core.
82
39
  *
83
- * @param config - Mutation configuration.
84
- * @returns Signal accessors plus `{ mutate, reset }`.
40
+ * @param options - TanStack mutation options, or a getter returning them.
41
+ * @param client - Optional {@link QueryClient} (defaults to the shared singleton).
42
+ * @returns A reactive {@link MutationObserverResult} store.
85
43
  *
86
44
  * @example
87
45
  * ```tsx
@@ -90,13 +48,13 @@ export declare function useQuery<T>(config: UseQueryConfig<T>, client?: QueryCli
90
48
  *
91
49
  * function CreateUser() {
92
50
  * const qc = useQueryClient();
93
- * const { mutate, isLoading } = useMutation({
51
+ * const mutation = useMutation(() => ({
94
52
  * mutationFn: (name: string) => usePost("api", "createUser", { name }),
95
53
  * onSuccess: () => qc.invalidateQueries({ queryKey: ["users"] }),
96
- * });
97
- * return <button disabled={isLoading()} onClick={() => mutate("Ada")}>Create</button>;
54
+ * }));
55
+ * return <button disabled={mutation.isPending} onClick={() => mutation.mutate("Ada")}>Create</button>;
98
56
  * }
99
57
  * ```
100
58
  */
101
- export declare function useMutation<TData = unknown, TVariables = unknown>(config: UseMutationConfig<TData, TVariables>): UseMutationReturn<TData, TVariables>;
59
+ export declare function useMutation<TData = unknown, TError = Error, TVariables = void, TContext = unknown>(options: MutationObserverOptions<TData, TError, TVariables, TContext> | (() => MutationObserverOptions<TData, TError, TVariables, TContext>), client?: QueryClient): MutationObserverResult<TData, TError, TVariables, TContext>;
102
60
  //# sourceMappingURL=query.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/adapters/solid/query.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../../src/adapters/solid/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAEN,KAAK,uBAAuB,EAC5B,KAAK,sBAAsB,EAC3B,KAAK,WAAW,EAEhB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,MAAM,sBAAsB,CAAC;AAM9B,0EAA0E;AAC1E,MAAM,MAAM,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,IACtD,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,GACjD,CAAC,MAAM,oBAAoB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,QAAQ,CAAC,YAAY,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,KAAK,GAAG,YAAY,EACpF,OAAO,EAAE,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,CAAC,EACvD,MAAM,CAAC,EAAE,WAAW,GAClB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,CAsBpC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,WAAW,CAAC,KAAK,GAAG,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,UAAU,GAAG,IAAI,EAAE,QAAQ,GAAG,OAAO,EACjG,OAAO,EACJ,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,GAC5D,CAAC,MAAM,uBAAuB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC,EACvE,MAAM,CAAC,EAAE,WAAW,GAClB,sBAAsB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CAAC,CAqB7D"}