tanstack-query-callbacks 0.2.2 → 0.3.1

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 CHANGED
@@ -7,6 +7,7 @@
7
7
 
8
8
  [![npm peer dependency version - @tanstack/vue-query][peer-deps-tanstack-vue-query-src]][peer-deps-tanstack-vue-query-href]
9
9
  [![npm peer dependency version - @tanstack/react-query][peer-deps-tanstack-react-query-src]][peer-deps-tanstack-react-query-href]
10
+ [![npm peer dependency version - @tanstack/svelte-query][peer-deps-tanstack-svelte-query-src]][peer-deps-tanstack-svelte-query-href]
10
11
 
11
12
  Use callbacks of query in the usual way, as before.
12
13
 
@@ -15,7 +16,7 @@ The tanstack/query has removed `onSuccess`, `onError` and `onSettled` from useQu
15
16
  # Features
16
17
 
17
18
  - Support Tanstack/Query v4, v5
18
- - Support Vue, React
19
+ - Support Vue, React, Svelte
19
20
 
20
21
  ## Instanll
21
22
 
@@ -74,6 +75,34 @@ useQueryCallbacks({
74
75
  })
75
76
  ```
76
77
 
78
+ ## Usage (Svelte)
79
+
80
+ ```svelte
81
+ <script>
82
+ import { createQuery } from '@tanstack/svelte-query'
83
+ import { useQueryCallbacks } from 'tanstack-query-callbacks/svelte'
84
+
85
+ const queryKey = ['foo']
86
+ const query = createQuery({
87
+ queryKey,
88
+ queryFn: () => Promise.resolve('bar')
89
+ })
90
+
91
+ useQueryCallbacks({
92
+ queryKey,
93
+ onSuccess: (data) => {
94
+ console.log('success', data)
95
+ },
96
+ onError: (err) => {
97
+ console.error('error', err)
98
+ },
99
+ onSettled: (data, err) => {
100
+ console.log('settled', { data, err })
101
+ }
102
+ })
103
+ </script>
104
+ ```
105
+
77
106
  <!-- Link Resources -->
78
107
 
79
108
  [npm-version-src]: https://img.shields.io/npm/v/tanstack-query-callbacks?style=flat&colorA=18181B&colorB=F0DB4F
@@ -88,3 +117,5 @@ useQueryCallbacks({
88
117
  [peer-deps-tanstack-vue-query-href]: https://www.npmjs.com/package/@tanstack/vue-query
89
118
  [peer-deps-tanstack-react-query-src]: https://img.shields.io/npm/dependency-version/tanstack-query-callbacks/peer/@tanstack/react-query?style=flat&colorA=18181B&colorB=F0DB4F
90
119
  [peer-deps-tanstack-react-query-href]: https://www.npmjs.com/package/@tanstack/react-query
120
+ [peer-deps-tanstack-svelte-query-src]: https://img.shields.io/npm/dependency-version/tanstack-query-callbacks/peer/@tanstack/svelte-query?style=flat&colorA=18181B&colorB=F0DB4F
121
+ [peer-deps-tanstack-svelte-query-href]: https://www.npmjs.com/package/@tanstack/svelte-query
package/dist/index.cjs ADDED
@@ -0,0 +1,35 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ let _tanstack_query_core = require("@tanstack/query-core");
3
+
4
+ //#region src/index.ts
5
+ function subscribeQueryCallbacks({ queryClient, queryKey, onSuccess, onError, onSettled }) {
6
+ if (!onSuccess && !onError && !onSettled) return noop;
7
+ return queryClient.getQueryCache().subscribe((event) => {
8
+ if (event.type !== "updated") return;
9
+ if (!(0, _tanstack_query_core.matchQuery)({
10
+ queryKey,
11
+ exact: true
12
+ }, event.query)) return;
13
+ switch (event.action.type) {
14
+ case "success":
15
+ /* istanbul ignore else */
16
+ if (!event.action.manual) {
17
+ onSuccess?.(event.action.data);
18
+ onSettled?.(event.action.data, null);
19
+ }
20
+ break;
21
+ case "failed":
22
+ case "error":
23
+ /* istanbul ignore else */
24
+ if (!(0, _tanstack_query_core.isCancelledError)(event.action.error)) {
25
+ onError?.(event.action.error);
26
+ onSettled?.(void 0, event.action.error);
27
+ }
28
+ break;
29
+ }
30
+ });
31
+ }
32
+ function noop() {}
33
+
34
+ //#endregion
35
+ exports.subscribeQueryCallbacks = subscribeQueryCallbacks;
@@ -0,0 +1,24 @@
1
+ import { QueryClient, QueryKey } from "@tanstack/query-core";
2
+
3
+ //#region src/index.d.ts
4
+ type QuerySuccessHandler<TQueryFnData> = (data: TQueryFnData) => void;
5
+ type QueryErrorHandler<TError> = (err: TError) => void;
6
+ type QuerySettledHandler<TQueryFnData, TError> = (data: TQueryFnData | undefined, error: TError | null) => void;
7
+ interface QueryCallbacks<TQueryFnData, TError> {
8
+ onSuccess?: QuerySuccessHandler<TQueryFnData>;
9
+ onError?: QueryErrorHandler<TError>;
10
+ onSettled?: QuerySettledHandler<TQueryFnData, TError>;
11
+ }
12
+ interface SubscribeQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
13
+ queryClient: QueryClient;
14
+ queryKey: QueryKey;
15
+ }
16
+ declare function subscribeQueryCallbacks<TQueryFnData = unknown, TError = unknown>({
17
+ queryClient,
18
+ queryKey,
19
+ onSuccess,
20
+ onError,
21
+ onSettled
22
+ }: SubscribeQueryCallbacksProps<TQueryFnData, TError>): () => void;
23
+ //#endregion
24
+ export { QueryCallbacks, QueryErrorHandler, QuerySettledHandler, QuerySuccessHandler, SubscribeQueryCallbacksProps, subscribeQueryCallbacks };
@@ -0,0 +1,24 @@
1
+ import { QueryClient, QueryKey } from "@tanstack/query-core";
2
+
3
+ //#region src/index.d.ts
4
+ type QuerySuccessHandler<TQueryFnData> = (data: TQueryFnData) => void;
5
+ type QueryErrorHandler<TError> = (err: TError) => void;
6
+ type QuerySettledHandler<TQueryFnData, TError> = (data: TQueryFnData | undefined, error: TError | null) => void;
7
+ interface QueryCallbacks<TQueryFnData, TError> {
8
+ onSuccess?: QuerySuccessHandler<TQueryFnData>;
9
+ onError?: QueryErrorHandler<TError>;
10
+ onSettled?: QuerySettledHandler<TQueryFnData, TError>;
11
+ }
12
+ interface SubscribeQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
13
+ queryClient: QueryClient;
14
+ queryKey: QueryKey;
15
+ }
16
+ declare function subscribeQueryCallbacks<TQueryFnData = unknown, TError = unknown>({
17
+ queryClient,
18
+ queryKey,
19
+ onSuccess,
20
+ onError,
21
+ onSettled
22
+ }: SubscribeQueryCallbacksProps<TQueryFnData, TError>): () => void;
23
+ //#endregion
24
+ export { QueryCallbacks, QueryErrorHandler, QuerySettledHandler, QuerySuccessHandler, SubscribeQueryCallbacksProps, subscribeQueryCallbacks };
package/dist/index.js ADDED
@@ -0,0 +1,34 @@
1
+ import { isCancelledError, matchQuery } from "@tanstack/query-core";
2
+
3
+ //#region src/index.ts
4
+ function subscribeQueryCallbacks({ queryClient, queryKey, onSuccess, onError, onSettled }) {
5
+ if (!onSuccess && !onError && !onSettled) return noop;
6
+ return queryClient.getQueryCache().subscribe((event) => {
7
+ if (event.type !== "updated") return;
8
+ if (!matchQuery({
9
+ queryKey,
10
+ exact: true
11
+ }, event.query)) return;
12
+ switch (event.action.type) {
13
+ case "success":
14
+ /* istanbul ignore else */
15
+ if (!event.action.manual) {
16
+ onSuccess?.(event.action.data);
17
+ onSettled?.(event.action.data, null);
18
+ }
19
+ break;
20
+ case "failed":
21
+ case "error":
22
+ /* istanbul ignore else */
23
+ if (!isCancelledError(event.action.error)) {
24
+ onError?.(event.action.error);
25
+ onSettled?.(void 0, event.action.error);
26
+ }
27
+ break;
28
+ }
29
+ });
30
+ }
31
+ function noop() {}
32
+
33
+ //#endregion
34
+ export { subscribeQueryCallbacks };
@@ -1,29 +1,26 @@
1
- 'use strict';
2
-
3
- const reactQuery = require('@tanstack/react-query');
4
- const react = require('react');
5
- const core_index = require('../core/index.cjs');
6
- require('@tanstack/query-core');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_index = require('../index.cjs');
3
+ let _tanstack_react_query = require("@tanstack/react-query");
4
+ let react = require("react");
7
5
 
6
+ //#region src/react/index.ts
8
7
  function useQueryCallbacks(props) {
9
- const queryClient = reactQuery.useQueryClient(
10
- props.context ? { context: props.context } : props.queryClient
11
- // for v5
12
- );
13
- react.useEffect(() => {
14
- return core_index.subscribeQueryCallbacks({
15
- queryClient,
16
- queryKey: props.queryKey,
17
- onSuccess: props.onSuccess,
18
- onError: props.onError,
19
- onSettled: props.onSettled
20
- });
21
- }, [
22
- props.queryKey,
23
- props.onSuccess,
24
- props.onError,
25
- props.onSettled
26
- ]);
8
+ const queryClient = (0, _tanstack_react_query.useQueryClient)(props.context ? { context: props.context } : props.queryClient);
9
+ (0, react.useEffect)(() => {
10
+ return require_index.subscribeQueryCallbacks({
11
+ queryClient,
12
+ queryKey: props.queryKey,
13
+ onSuccess: props.onSuccess,
14
+ onError: props.onError,
15
+ onSettled: props.onSettled
16
+ });
17
+ }, [
18
+ props.queryKey,
19
+ props.onSuccess,
20
+ props.onError,
21
+ props.onSettled
22
+ ]);
27
23
  }
28
24
 
29
- exports.useQueryCallbacks = useQueryCallbacks;
25
+ //#endregion
26
+ exports.useQueryCallbacks = useQueryCallbacks;
@@ -1,20 +1,19 @@
1
- import { QueryKey, QueryClient } from '@tanstack/react-query';
2
- import { Context } from 'react';
3
- import { QueryCallbacks } from '../core/index.cjs';
4
- import '@tanstack/query-core';
1
+ import { QueryCallbacks } from "../index.cjs";
2
+ import { QueryClient, QueryKey } from "@tanstack/react-query";
3
+ import { Context } from "react";
5
4
 
5
+ //#region src/react/index.d.ts
6
6
  interface UseQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
7
- queryKey: QueryKey;
8
- /**
9
- * QueryClient instance
10
- */
11
- queryClient?: QueryClient;
12
- /**
13
- * QueryClient context for v4
14
- */
15
- context?: Context<QueryClient | undefined>;
7
+ queryKey: QueryKey;
8
+ /**
9
+ * QueryClient instance
10
+ */
11
+ queryClient?: QueryClient;
12
+ /**
13
+ * QueryClient context for v4
14
+ */
15
+ context?: Context<QueryClient | undefined>;
16
16
  }
17
17
  declare function useQueryCallbacks<TQueryFnData = unknown, TError = unknown>(props: UseQueryCallbacksProps<TQueryFnData, TError>): void;
18
-
19
- export { useQueryCallbacks };
20
- export type { UseQueryCallbacksProps };
18
+ //#endregion
19
+ export { UseQueryCallbacksProps, useQueryCallbacks };
@@ -1,20 +1,19 @@
1
- import { QueryKey, QueryClient } from '@tanstack/react-query';
2
- import { Context } from 'react';
3
- import { QueryCallbacks } from '../core/index.js';
4
- import '@tanstack/query-core';
1
+ import { QueryCallbacks } from "../index.js";
2
+ import { QueryClient, QueryKey } from "@tanstack/react-query";
3
+ import { Context } from "react";
5
4
 
5
+ //#region src/react/index.d.ts
6
6
  interface UseQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
7
- queryKey: QueryKey;
8
- /**
9
- * QueryClient instance
10
- */
11
- queryClient?: QueryClient;
12
- /**
13
- * QueryClient context for v4
14
- */
15
- context?: Context<QueryClient | undefined>;
7
+ queryKey: QueryKey;
8
+ /**
9
+ * QueryClient instance
10
+ */
11
+ queryClient?: QueryClient;
12
+ /**
13
+ * QueryClient context for v4
14
+ */
15
+ context?: Context<QueryClient | undefined>;
16
16
  }
17
17
  declare function useQueryCallbacks<TQueryFnData = unknown, TError = unknown>(props: UseQueryCallbacksProps<TQueryFnData, TError>): void;
18
-
19
- export { useQueryCallbacks };
20
- export type { UseQueryCallbacksProps };
18
+ //#endregion
19
+ export { UseQueryCallbacksProps, useQueryCallbacks };
@@ -0,0 +1,25 @@
1
+ import { subscribeQueryCallbacks } from "../index.js";
2
+ import { useQueryClient } from "@tanstack/react-query";
3
+ import { useEffect } from "react";
4
+
5
+ //#region src/react/index.ts
6
+ function useQueryCallbacks(props) {
7
+ const queryClient = useQueryClient(props.context ? { context: props.context } : props.queryClient);
8
+ useEffect(() => {
9
+ return subscribeQueryCallbacks({
10
+ queryClient,
11
+ queryKey: props.queryKey,
12
+ onSuccess: props.onSuccess,
13
+ onError: props.onError,
14
+ onSettled: props.onSettled
15
+ });
16
+ }, [
17
+ props.queryKey,
18
+ props.onSuccess,
19
+ props.onError,
20
+ props.onSettled
21
+ ]);
22
+ }
23
+
24
+ //#endregion
25
+ export { useQueryCallbacks };
@@ -0,0 +1,4 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_index_svelte = require('./index.svelte.cjs');
3
+
4
+ exports.useQueryCallbacks = require_index_svelte.useQueryCallbacks;
@@ -0,0 +1,2 @@
1
+ import { UseQueryCallbacksProps, useQueryCallbacks } from "./index.svelte.cjs";
2
+ export { UseQueryCallbacksProps, useQueryCallbacks };
@@ -0,0 +1,2 @@
1
+ import { UseQueryCallbacksProps, useQueryCallbacks } from "./index.svelte.js";
2
+ export { UseQueryCallbacksProps, useQueryCallbacks };
@@ -0,0 +1,3 @@
1
+ import { useQueryCallbacks } from "./index.svelte.js";
2
+
3
+ export { useQueryCallbacks };
@@ -0,0 +1,23 @@
1
+ const require_index = require('../index.cjs');
2
+ let _tanstack_svelte_query = require("@tanstack/svelte-query");
3
+ let svelte = require("svelte");
4
+
5
+ //#region src/svelte/index.svelte.ts
6
+ function useQueryCallbacks(props) {
7
+ const _props = $derived(props());
8
+ const queryClient = $derived((0, _tanstack_svelte_query.useQueryClient)(_props.queryClient));
9
+ $effect(() => {
10
+ const _queryKey = _props.queryKey;
11
+ const _queryClient = queryClient;
12
+ return (0, svelte.untrack)(() => require_index.subscribeQueryCallbacks({
13
+ queryClient: _queryClient,
14
+ queryKey: _queryKey,
15
+ onSuccess: _props.onSuccess,
16
+ onError: _props.onError,
17
+ onSettled: _props.onSettled
18
+ }));
19
+ });
20
+ }
21
+
22
+ //#endregion
23
+ exports.useQueryCallbacks = useQueryCallbacks;
@@ -0,0 +1,14 @@
1
+ import { QueryCallbacks } from "../index.cjs";
2
+ import { QueryClient, QueryKey } from "@tanstack/svelte-query";
3
+
4
+ //#region src/svelte/index.svelte.d.ts
5
+ interface UseQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
6
+ queryKey: QueryKey;
7
+ /**
8
+ * QueryClient instance
9
+ */
10
+ queryClient?: QueryClient;
11
+ }
12
+ declare function useQueryCallbacks<TQueryFnData = unknown, TError = unknown>(props: () => UseQueryCallbacksProps<TQueryFnData, TError>): void;
13
+ //#endregion
14
+ export { UseQueryCallbacksProps, useQueryCallbacks };
@@ -0,0 +1,14 @@
1
+ import { QueryCallbacks } from "../index.js";
2
+ import { QueryClient, QueryKey } from "@tanstack/svelte-query";
3
+
4
+ //#region src/svelte/index.svelte.d.ts
5
+ interface UseQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
6
+ queryKey: QueryKey;
7
+ /**
8
+ * QueryClient instance
9
+ */
10
+ queryClient?: QueryClient;
11
+ }
12
+ declare function useQueryCallbacks<TQueryFnData = unknown, TError = unknown>(props: () => UseQueryCallbacksProps<TQueryFnData, TError>): void;
13
+ //#endregion
14
+ export { UseQueryCallbacksProps, useQueryCallbacks };
@@ -0,0 +1,23 @@
1
+ import { subscribeQueryCallbacks } from "../index.js";
2
+ import { useQueryClient } from "@tanstack/svelte-query";
3
+ import { untrack } from "svelte";
4
+
5
+ //#region src/svelte/index.svelte.ts
6
+ function useQueryCallbacks(props) {
7
+ const _props = $derived(props());
8
+ const queryClient = $derived(useQueryClient(_props.queryClient));
9
+ $effect(() => {
10
+ const _queryKey = _props.queryKey;
11
+ const _queryClient = queryClient;
12
+ return untrack(() => subscribeQueryCallbacks({
13
+ queryClient: _queryClient,
14
+ queryKey: _queryKey,
15
+ onSuccess: _props.onSuccess,
16
+ onError: _props.onError,
17
+ onSettled: _props.onSettled
18
+ }));
19
+ });
20
+ }
21
+
22
+ //#endregion
23
+ export { useQueryCallbacks };
@@ -1,28 +1,27 @@
1
- 'use strict';
2
-
3
- const vueQuery = require('@tanstack/vue-query');
4
- const vueDemi = require('vue-demi');
5
- const core_index = require('../core/index.cjs');
6
- require('@tanstack/query-core');
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_index = require('../index.cjs');
3
+ let _tanstack_vue_query = require("@tanstack/vue-query");
4
+ let vue_demi = require("vue-demi");
7
5
 
6
+ //#region src/vue/index.ts
8
7
  function useQueryCallbacks(props) {
9
- const queryClient = props.queryClient ?? (props.queryClientKey ? vueDemi.inject(props.queryClientKey, void 0) : void 0) ?? vueQuery.useQueryClient(props.queryClientId);
10
- vueDemi.watch(
11
- () => vueDemi.unref(props.queryKey),
12
- (queryKey, _oldVal, onCleanup) => {
13
- const unsubscribe = core_index.subscribeQueryCallbacks({
14
- queryClient,
15
- queryKey,
16
- onSuccess: props.onSuccess,
17
- onError: props.onError,
18
- onSettled: props.onSettled
19
- });
20
- onCleanup(() => {
21
- unsubscribe();
22
- });
23
- },
24
- { immediate: true, flush: "sync" }
25
- );
8
+ const queryClient = props.queryClient ?? (props.queryClientKey ? (0, vue_demi.inject)(props.queryClientKey, void 0) : void 0) ?? (0, _tanstack_vue_query.useQueryClient)(props.queryClientId);
9
+ (0, vue_demi.watch)(() => (0, vue_demi.unref)(props.queryKey), (queryKey, _oldVal, onCleanup) => {
10
+ const unsubscribe = require_index.subscribeQueryCallbacks({
11
+ queryClient,
12
+ queryKey,
13
+ onSuccess: props.onSuccess,
14
+ onError: props.onError,
15
+ onSettled: props.onSettled
16
+ });
17
+ onCleanup(() => {
18
+ unsubscribe();
19
+ });
20
+ }, {
21
+ immediate: true,
22
+ flush: "sync"
23
+ });
26
24
  }
27
25
 
28
- exports.useQueryCallbacks = useQueryCallbacks;
26
+ //#endregion
27
+ exports.useQueryCallbacks = useQueryCallbacks;
@@ -1,24 +1,23 @@
1
- import { QueryKey, QueryClient } from '@tanstack/vue-query';
2
- import { Ref } from 'vue-demi';
3
- import { QueryCallbacks } from '../core/index.cjs';
4
- import '@tanstack/query-core';
1
+ import { QueryCallbacks } from "../index.cjs";
2
+ import { QueryClient, QueryKey } from "@tanstack/vue-query";
3
+ import { Ref } from "vue-demi";
5
4
 
5
+ //#region src/vue/index.d.ts
6
6
  interface UseQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
7
- queryKey: QueryKey | Ref<QueryKey>;
8
- /**
9
- * QueryClient instance
10
- */
11
- queryClient?: QueryClient;
12
- /**
13
- * QueryClient Context Key for inject
14
- */
15
- queryClientKey?: string;
16
- /**
17
- * QueryClient ID for v5 useQueryClient()
18
- */
19
- queryClientId?: string;
7
+ queryKey: QueryKey | Ref<QueryKey>;
8
+ /**
9
+ * QueryClient instance
10
+ */
11
+ queryClient?: QueryClient;
12
+ /**
13
+ * QueryClient Context Key for inject
14
+ */
15
+ queryClientKey?: string;
16
+ /**
17
+ * QueryClient ID for v5 useQueryClient()
18
+ */
19
+ queryClientId?: string;
20
20
  }
21
21
  declare function useQueryCallbacks<TQueryFnData = unknown, TError = unknown>(props: UseQueryCallbacksProps<TQueryFnData, TError>): void;
22
-
23
- export { useQueryCallbacks };
24
- export type { UseQueryCallbacksProps };
22
+ //#endregion
23
+ export { UseQueryCallbacksProps, useQueryCallbacks };
@@ -1,24 +1,23 @@
1
- import { QueryKey, QueryClient } from '@tanstack/vue-query';
2
- import { Ref } from 'vue-demi';
3
- import { QueryCallbacks } from '../core/index.js';
4
- import '@tanstack/query-core';
1
+ import { QueryCallbacks } from "../index.js";
2
+ import { QueryClient, QueryKey } from "@tanstack/vue-query";
3
+ import { Ref } from "vue-demi";
5
4
 
5
+ //#region src/vue/index.d.ts
6
6
  interface UseQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
7
- queryKey: QueryKey | Ref<QueryKey>;
8
- /**
9
- * QueryClient instance
10
- */
11
- queryClient?: QueryClient;
12
- /**
13
- * QueryClient Context Key for inject
14
- */
15
- queryClientKey?: string;
16
- /**
17
- * QueryClient ID for v5 useQueryClient()
18
- */
19
- queryClientId?: string;
7
+ queryKey: QueryKey | Ref<QueryKey>;
8
+ /**
9
+ * QueryClient instance
10
+ */
11
+ queryClient?: QueryClient;
12
+ /**
13
+ * QueryClient Context Key for inject
14
+ */
15
+ queryClientKey?: string;
16
+ /**
17
+ * QueryClient ID for v5 useQueryClient()
18
+ */
19
+ queryClientId?: string;
20
20
  }
21
21
  declare function useQueryCallbacks<TQueryFnData = unknown, TError = unknown>(props: UseQueryCallbacksProps<TQueryFnData, TError>): void;
22
-
23
- export { useQueryCallbacks };
24
- export type { UseQueryCallbacksProps };
22
+ //#endregion
23
+ export { UseQueryCallbacksProps, useQueryCallbacks };
@@ -0,0 +1,26 @@
1
+ import { subscribeQueryCallbacks } from "../index.js";
2
+ import { useQueryClient } from "@tanstack/vue-query";
3
+ import { inject, unref, watch } from "vue-demi";
4
+
5
+ //#region src/vue/index.ts
6
+ function useQueryCallbacks(props) {
7
+ const queryClient = props.queryClient ?? (props.queryClientKey ? inject(props.queryClientKey, void 0) : void 0) ?? useQueryClient(props.queryClientId);
8
+ watch(() => unref(props.queryKey), (queryKey, _oldVal, onCleanup) => {
9
+ const unsubscribe = subscribeQueryCallbacks({
10
+ queryClient,
11
+ queryKey,
12
+ onSuccess: props.onSuccess,
13
+ onError: props.onError,
14
+ onSettled: props.onSettled
15
+ });
16
+ onCleanup(() => {
17
+ unsubscribe();
18
+ });
19
+ }, {
20
+ immediate: true,
21
+ flush: "sync"
22
+ });
23
+ }
24
+
25
+ //#endregion
26
+ export { useQueryCallbacks };
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "tanstack-query-callbacks",
3
3
  "type": "module",
4
- "version": "0.2.2",
4
+ "version": "0.3.1",
5
5
  "author": "zhong666 <hi@zhong666.me>",
6
6
  "license": "MIT",
7
7
  "homepage": "https://github.com/aa900031/tanstack-query-callbacks#readme",
@@ -15,6 +15,7 @@
15
15
  "keywords": [
16
16
  "tanstack",
17
17
  "tanstack-query",
18
+ "svelte-query",
18
19
  "vue-query",
19
20
  "react-query"
20
21
  ],
@@ -22,29 +23,53 @@
22
23
  "exports": {
23
24
  ".": {
24
25
  "import": {
25
- "types": "./dist/core/index.d.mts",
26
- "default": "./dist/core/index.mjs"
26
+ "types": "./dist/index.d.ts",
27
+ "default": "./dist/index.js"
27
28
  },
28
29
  "require": {
29
- "types": "./dist/core/index.d.cts",
30
- "default": "./dist/core/index.cjs"
30
+ "types": "./dist/index.d.cts",
31
+ "default": "./dist/index.cjs"
32
+ }
33
+ },
34
+ "./react": {
35
+ "import": {
36
+ "types": "./dist/react/index.d.ts",
37
+ "default": "./dist/react/index.js"
38
+ },
39
+ "require": {
40
+ "types": "./dist/react/index.d.cts",
41
+ "default": "./dist/react/index.cjs"
42
+ }
43
+ },
44
+ "./svelte": {
45
+ "import": {
46
+ "types": "./dist/svelte/index.d.ts",
47
+ "default": "./dist/svelte/index.js"
48
+ },
49
+ "require": {
50
+ "types": "./dist/svelte/index.d.cts",
51
+ "default": "./dist/svelte/index.cjs"
31
52
  }
32
53
  },
33
54
  "./vue": {
34
- "import": "./dist/vue/index.mjs",
35
- "require": "./dist/vue/index.cjs"
55
+ "import": {
56
+ "types": "./dist/vue/index.d.ts",
57
+ "default": "./dist/vue/index.js"
58
+ },
59
+ "require": {
60
+ "types": "./dist/vue/index.d.cts",
61
+ "default": "./dist/vue/index.cjs"
62
+ }
36
63
  },
37
- "./react": {
38
- "import": "./dist/react/index.mjs",
39
- "require": "./dist/react/index.cjs"
40
- }
64
+ "./package.json": "./package.json"
41
65
  },
42
- "main": "dist/core/index.cjs",
43
- "module": "dist/core/index.mjs",
44
- "types": "dist/core/index.d.ts",
66
+ "main": "./dist/index.cjs",
67
+ "module": "./dist/index.js",
68
+ "types": "./dist/index.d.cts",
45
69
  "files": [
46
70
  "dist",
47
71
  "react.d.ts",
72
+ "svelte.d.ts",
48
73
  "vue.d.ts"
49
74
  ],
50
75
  "publishConfig": {
@@ -53,15 +78,20 @@
53
78
  "peerDependencies": {
54
79
  "@tanstack/query-core": "^4.* || ^5.*",
55
80
  "@tanstack/react-query": "^4.* || ^5.*",
81
+ "@tanstack/svelte-query": "^4.* || ^5.*",
56
82
  "@tanstack/vue-query": "^4.* || ^5.*",
57
83
  "@vue/composition-api": "^1.1.0",
58
84
  "react": "^18.0.0",
85
+ "svelte": "^3.0.0 || ^4.0.0 || ^5.0.0",
59
86
  "vue": "^2.6.12 || ^3.2.0"
60
87
  },
61
88
  "peerDependenciesMeta": {
62
89
  "@tanstack/react-query": {
63
90
  "optional": true
64
91
  },
92
+ "@tanstack/svelte-query": {
93
+ "optional": true
94
+ },
65
95
  "@tanstack/vue-query": {
66
96
  "optional": true
67
97
  },
@@ -71,46 +101,53 @@
71
101
  "react": {
72
102
  "optional": true
73
103
  },
104
+ "svelte": {
105
+ "optional": true
106
+ },
74
107
  "vue": {
75
108
  "optional": true
76
109
  }
77
110
  },
78
111
  "devDependencies": {
79
- "@aa900031/eslint-config": "^3.2.0",
80
- "@aa900031/release-it-config": "^0.1.0",
81
- "@tanstack/query-core": "^5.90.10",
112
+ "@aa900031/eslint-config": "^6.0.0",
113
+ "@aa900031/release-it-config": "^0.1.1",
114
+ "@aa900031/tsdown-config": "^0.1.1",
115
+ "@sveltejs/vite-plugin-svelte": "^6.2.4",
116
+ "@tanstack/query-core": "^5.90.20",
82
117
  "@tanstack/query-core-v4": "npm:@tanstack/query-core@^4.41.0",
83
- "@tanstack/react-query": "^5.90.10",
118
+ "@tanstack/react-query": "^5.90.21",
84
119
  "@tanstack/react-query-v4": "npm:@tanstack/react-query@^4.42.0",
85
- "@tanstack/vue-query": "^5.91.2",
120
+ "@tanstack/svelte-query": "^6.0.18",
121
+ "@tanstack/vue-query": "^5.92.9",
86
122
  "@tanstack/vue-query-v4": "npm:@tanstack/vue-query@^4.41.0",
87
123
  "@testing-library/react": "14.3.1",
124
+ "@testing-library/svelte": "^5.2.7",
88
125
  "@testing-library/vue": "^8.1.0",
89
126
  "@tsconfig/node18": "^18.2.5",
90
127
  "@types/node": "^18.19.130",
91
- "@types/react": "^18.3.26",
128
+ "@types/react": "^18.3.28",
92
129
  "@types/react-dom": "^18.3.7",
93
130
  "@vitest/coverage-istanbul": "^3.2.4",
131
+ "@vitest/coverage-v8": "3.2.4",
94
132
  "@vitest/ui": "^3.2.4",
95
133
  "@vue/composition-api": "^1.7.2",
96
- "eslint": "^9.39.1",
97
- "happy-dom": "^20.0.10",
134
+ "eslint": "^9.39.3",
135
+ "happy-dom": "^20.7.0",
98
136
  "npm-run-all2": "^8.0.4",
99
137
  "react": "^18.3.1",
100
138
  "react-dom": "^18.3.1",
101
- "release-it": "^19.0.6",
139
+ "release-it": "^19.2.4",
140
+ "svelte": "^5.53.3",
141
+ "tsdown": "^0.20.0",
102
142
  "typescript": "^5.9.3",
103
- "unbuild": "^3.6.1",
143
+ "typescript-svelte-plugin": "^0.3.50",
104
144
  "vitest": "^3.2.4",
105
- "vue": "^3.5.24",
145
+ "vue": "^3.5.29",
106
146
  "vue-2": "npm:vue@~2.6.14",
107
147
  "vue-2.7": "npm:vue@~2.7.16"
108
148
  },
109
- "resolutions": {
110
- "vue-demi": "latest"
111
- },
112
149
  "scripts": {
113
- "build": "unbuild",
150
+ "build": "tsdown",
114
151
  "test": "vitest run",
115
152
  "test:vue": "vue-demi-switch 3 && vitest run --dir ./src/vue",
116
153
  "test:vue-2": "vue-demi-switch 2 vue-2 && vitest run --dir ./src/vue",
package/svelte.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ // eslint-disable-next-line ts/ban-ts-comment
2
+ // @ts-ignore
3
+ export * from './dist/svelte'
@@ -1,42 +0,0 @@
1
- 'use strict';
2
-
3
- const queryCore = require('@tanstack/query-core');
4
-
5
- function subscribeQueryCallbacks({
6
- queryClient,
7
- queryKey,
8
- onSuccess,
9
- onError,
10
- onSettled
11
- }) {
12
- if (!onSuccess && !onError && !onSettled)
13
- return noop;
14
- const cache = queryClient.getQueryCache();
15
- const unsubscribe = cache.subscribe((event) => {
16
- if (event.type !== "updated")
17
- return;
18
- if (!queryCore.matchQuery({ queryKey, exact: true }, event.query))
19
- return;
20
- switch (event.action.type) {
21
- case "success": {
22
- if (!event.action.manual) {
23
- onSuccess?.(event.action.data);
24
- onSettled?.(event.action.data, null);
25
- }
26
- break;
27
- }
28
- case "error": {
29
- if (!queryCore.isCancelledError(event.action.error)) {
30
- onError?.(event.action.error);
31
- onSettled?.(void 0, event.action.error);
32
- }
33
- break;
34
- }
35
- }
36
- });
37
- return unsubscribe;
38
- }
39
- function noop() {
40
- }
41
-
42
- exports.subscribeQueryCallbacks = subscribeQueryCallbacks;
@@ -1,18 +0,0 @@
1
- import { QueryClient, QueryKey } from '@tanstack/query-core';
2
-
3
- type QuerySuccessHandler<TQueryFnData> = (data: TQueryFnData) => void;
4
- type QueryErrorHandler<TError> = (err: TError) => void;
5
- type QuerySettledHandler<TQueryFnData, TError> = (data: TQueryFnData | undefined, error: TError | null) => void;
6
- interface QueryCallbacks<TQueryFnData, TError> {
7
- onSuccess?: QuerySuccessHandler<TQueryFnData>;
8
- onError?: QueryErrorHandler<TError>;
9
- onSettled?: QuerySettledHandler<TQueryFnData, TError>;
10
- }
11
- interface SubscribeQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
12
- queryClient: QueryClient;
13
- queryKey: QueryKey;
14
- }
15
- declare function subscribeQueryCallbacks<TQueryFnData = unknown, TError = unknown>({ queryClient, queryKey, onSuccess, onError, onSettled, }: SubscribeQueryCallbacksProps<TQueryFnData, TError>): () => void;
16
-
17
- export { subscribeQueryCallbacks };
18
- export type { QueryCallbacks, QueryErrorHandler, QuerySettledHandler, QuerySuccessHandler, SubscribeQueryCallbacksProps };
@@ -1,18 +0,0 @@
1
- import { QueryClient, QueryKey } from '@tanstack/query-core';
2
-
3
- type QuerySuccessHandler<TQueryFnData> = (data: TQueryFnData) => void;
4
- type QueryErrorHandler<TError> = (err: TError) => void;
5
- type QuerySettledHandler<TQueryFnData, TError> = (data: TQueryFnData | undefined, error: TError | null) => void;
6
- interface QueryCallbacks<TQueryFnData, TError> {
7
- onSuccess?: QuerySuccessHandler<TQueryFnData>;
8
- onError?: QueryErrorHandler<TError>;
9
- onSettled?: QuerySettledHandler<TQueryFnData, TError>;
10
- }
11
- interface SubscribeQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
12
- queryClient: QueryClient;
13
- queryKey: QueryKey;
14
- }
15
- declare function subscribeQueryCallbacks<TQueryFnData = unknown, TError = unknown>({ queryClient, queryKey, onSuccess, onError, onSettled, }: SubscribeQueryCallbacksProps<TQueryFnData, TError>): () => void;
16
-
17
- export { subscribeQueryCallbacks };
18
- export type { QueryCallbacks, QueryErrorHandler, QuerySettledHandler, QuerySuccessHandler, SubscribeQueryCallbacksProps };
@@ -1,18 +0,0 @@
1
- import { QueryClient, QueryKey } from '@tanstack/query-core';
2
-
3
- type QuerySuccessHandler<TQueryFnData> = (data: TQueryFnData) => void;
4
- type QueryErrorHandler<TError> = (err: TError) => void;
5
- type QuerySettledHandler<TQueryFnData, TError> = (data: TQueryFnData | undefined, error: TError | null) => void;
6
- interface QueryCallbacks<TQueryFnData, TError> {
7
- onSuccess?: QuerySuccessHandler<TQueryFnData>;
8
- onError?: QueryErrorHandler<TError>;
9
- onSettled?: QuerySettledHandler<TQueryFnData, TError>;
10
- }
11
- interface SubscribeQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
12
- queryClient: QueryClient;
13
- queryKey: QueryKey;
14
- }
15
- declare function subscribeQueryCallbacks<TQueryFnData = unknown, TError = unknown>({ queryClient, queryKey, onSuccess, onError, onSettled, }: SubscribeQueryCallbacksProps<TQueryFnData, TError>): () => void;
16
-
17
- export { subscribeQueryCallbacks };
18
- export type { QueryCallbacks, QueryErrorHandler, QuerySettledHandler, QuerySuccessHandler, SubscribeQueryCallbacksProps };
@@ -1,40 +0,0 @@
1
- import { matchQuery, isCancelledError } from '@tanstack/query-core';
2
-
3
- function subscribeQueryCallbacks({
4
- queryClient,
5
- queryKey,
6
- onSuccess,
7
- onError,
8
- onSettled
9
- }) {
10
- if (!onSuccess && !onError && !onSettled)
11
- return noop;
12
- const cache = queryClient.getQueryCache();
13
- const unsubscribe = cache.subscribe((event) => {
14
- if (event.type !== "updated")
15
- return;
16
- if (!matchQuery({ queryKey, exact: true }, event.query))
17
- return;
18
- switch (event.action.type) {
19
- case "success": {
20
- if (!event.action.manual) {
21
- onSuccess?.(event.action.data);
22
- onSettled?.(event.action.data, null);
23
- }
24
- break;
25
- }
26
- case "error": {
27
- if (!isCancelledError(event.action.error)) {
28
- onError?.(event.action.error);
29
- onSettled?.(void 0, event.action.error);
30
- }
31
- break;
32
- }
33
- }
34
- });
35
- return unsubscribe;
36
- }
37
- function noop() {
38
- }
39
-
40
- export { subscribeQueryCallbacks };
@@ -1,20 +0,0 @@
1
- import { QueryKey, QueryClient } from '@tanstack/react-query';
2
- import { Context } from 'react';
3
- import { QueryCallbacks } from '../core/index.mjs';
4
- import '@tanstack/query-core';
5
-
6
- interface UseQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
7
- queryKey: QueryKey;
8
- /**
9
- * QueryClient instance
10
- */
11
- queryClient?: QueryClient;
12
- /**
13
- * QueryClient context for v4
14
- */
15
- context?: Context<QueryClient | undefined>;
16
- }
17
- declare function useQueryCallbacks<TQueryFnData = unknown, TError = unknown>(props: UseQueryCallbacksProps<TQueryFnData, TError>): void;
18
-
19
- export { useQueryCallbacks };
20
- export type { UseQueryCallbacksProps };
@@ -1,27 +0,0 @@
1
- import { useQueryClient } from '@tanstack/react-query';
2
- import { useEffect } from 'react';
3
- import { subscribeQueryCallbacks } from '../core/index.mjs';
4
- import '@tanstack/query-core';
5
-
6
- function useQueryCallbacks(props) {
7
- const queryClient = useQueryClient(
8
- props.context ? { context: props.context } : props.queryClient
9
- // for v5
10
- );
11
- useEffect(() => {
12
- return subscribeQueryCallbacks({
13
- queryClient,
14
- queryKey: props.queryKey,
15
- onSuccess: props.onSuccess,
16
- onError: props.onError,
17
- onSettled: props.onSettled
18
- });
19
- }, [
20
- props.queryKey,
21
- props.onSuccess,
22
- props.onError,
23
- props.onSettled
24
- ]);
25
- }
26
-
27
- export { useQueryCallbacks };
@@ -1,24 +0,0 @@
1
- import { QueryKey, QueryClient } from '@tanstack/vue-query';
2
- import { Ref } from 'vue-demi';
3
- import { QueryCallbacks } from '../core/index.mjs';
4
- import '@tanstack/query-core';
5
-
6
- interface UseQueryCallbacksProps<TQueryFnData, TError> extends QueryCallbacks<TQueryFnData, TError> {
7
- queryKey: QueryKey | Ref<QueryKey>;
8
- /**
9
- * QueryClient instance
10
- */
11
- queryClient?: QueryClient;
12
- /**
13
- * QueryClient Context Key for inject
14
- */
15
- queryClientKey?: string;
16
- /**
17
- * QueryClient ID for v5 useQueryClient()
18
- */
19
- queryClientId?: string;
20
- }
21
- declare function useQueryCallbacks<TQueryFnData = unknown, TError = unknown>(props: UseQueryCallbacksProps<TQueryFnData, TError>): void;
22
-
23
- export { useQueryCallbacks };
24
- export type { UseQueryCallbacksProps };
@@ -1,26 +0,0 @@
1
- import { useQueryClient } from '@tanstack/vue-query';
2
- import { inject, watch, unref } from 'vue-demi';
3
- import { subscribeQueryCallbacks } from '../core/index.mjs';
4
- import '@tanstack/query-core';
5
-
6
- function useQueryCallbacks(props) {
7
- const queryClient = props.queryClient ?? (props.queryClientKey ? inject(props.queryClientKey, void 0) : void 0) ?? useQueryClient(props.queryClientId);
8
- watch(
9
- () => unref(props.queryKey),
10
- (queryKey, _oldVal, onCleanup) => {
11
- const unsubscribe = subscribeQueryCallbacks({
12
- queryClient,
13
- queryKey,
14
- onSuccess: props.onSuccess,
15
- onError: props.onError,
16
- onSettled: props.onSettled
17
- });
18
- onCleanup(() => {
19
- unsubscribe();
20
- });
21
- },
22
- { immediate: true, flush: "sync" }
23
- );
24
- }
25
-
26
- export { useQueryCallbacks };