@tanstack/react-query 5.38.0 → 5.39.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/build/legacy/HydrationBoundary.d.cts +1 -1
- package/build/legacy/HydrationBoundary.d.ts +1 -1
- package/build/legacy/useMutationState.cjs +1 -1
- package/build/legacy/useMutationState.cjs.map +1 -1
- package/build/legacy/useMutationState.js +1 -1
- package/build/legacy/useMutationState.js.map +1 -1
- package/build/modern/HydrationBoundary.d.cts +1 -1
- package/build/modern/HydrationBoundary.d.ts +1 -1
- package/build/modern/useMutationState.cjs +1 -1
- package/build/modern/useMutationState.cjs.map +1 -1
- package/build/modern/useMutationState.js +1 -1
- package/build/modern/useMutationState.js.map +1 -1
- package/package.json +6 -5
- package/src/__tests__/ssr-hydration.test.tsx +8 -17
- package/src/__tests__/suspense.test.tsx +9 -9
- package/src/__tests__/useMutation.test.tsx +7 -8
- package/src/useMutationState.ts +1 -1
|
@@ -9,6 +9,6 @@ interface HydrationBoundaryProps {
|
|
|
9
9
|
children?: React.ReactNode;
|
|
10
10
|
queryClient?: QueryClient;
|
|
11
11
|
}
|
|
12
|
-
declare const HydrationBoundary: ({ children, options, state, queryClient, }: HydrationBoundaryProps) => React.ReactElement<
|
|
12
|
+
declare const HydrationBoundary: ({ children, options, state, queryClient, }: HydrationBoundaryProps) => React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
13
13
|
|
|
14
14
|
export { HydrationBoundary, type HydrationBoundaryProps };
|
|
@@ -9,6 +9,6 @@ interface HydrationBoundaryProps {
|
|
|
9
9
|
children?: React.ReactNode;
|
|
10
10
|
queryClient?: QueryClient;
|
|
11
11
|
}
|
|
12
|
-
declare const HydrationBoundary: ({ children, options, state, queryClient, }: HydrationBoundaryProps) => React.ReactElement<
|
|
12
|
+
declare const HydrationBoundary: ({ children, options, state, queryClient, }: HydrationBoundaryProps) => React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
13
13
|
|
|
14
14
|
export { HydrationBoundary, type HydrationBoundaryProps };
|
|
@@ -53,7 +53,7 @@ function getResult(mutationCache, options) {
|
|
|
53
53
|
function useMutationState(options = {}, queryClient) {
|
|
54
54
|
const mutationCache = (0, import_QueryClientProvider.useQueryClient)(queryClient).getMutationCache();
|
|
55
55
|
const optionsRef = React.useRef(options);
|
|
56
|
-
const result = React.useRef();
|
|
56
|
+
const result = React.useRef(null);
|
|
57
57
|
if (!result.current) {
|
|
58
58
|
result.current = getResult(mutationCache, options);
|
|
59
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/useMutationState.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { notifyManager, replaceEqualDeep } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n Mutation,\n MutationCache,\n MutationFilters,\n MutationState,\n QueryClient,\n} from '@tanstack/query-core'\n\nexport function useIsMutating(\n filters?: MutationFilters,\n queryClient?: QueryClient,\n): number {\n const client = useQueryClient(queryClient)\n return useMutationState(\n { filters: { ...filters, status: 'pending' } },\n client,\n ).length\n}\n\ntype MutationStateOptions<TResult = MutationState> = {\n filters?: MutationFilters\n select?: (mutation: Mutation) => TResult\n}\n\nfunction getResult<TResult = MutationState>(\n mutationCache: MutationCache,\n options: MutationStateOptions<TResult>,\n): Array<TResult> {\n return mutationCache\n .findAll(options.filters)\n .map(\n (mutation): TResult =>\n (options.select ? options.select(mutation) : mutation.state) as TResult,\n )\n}\n\nexport function useMutationState<TResult = MutationState>(\n options: MutationStateOptions<TResult> = {},\n queryClient?: QueryClient,\n): Array<TResult> {\n const mutationCache = useQueryClient(queryClient).getMutationCache()\n const optionsRef = React.useRef(options)\n const result = React.useRef<Array<TResult>>()\n if (!result.current) {\n result.current = getResult(mutationCache, options)\n }\n\n React.useEffect(() => {\n optionsRef.current = options\n })\n\n return React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n mutationCache.subscribe(() => {\n const nextResult = replaceEqualDeep(\n result.current,\n getResult(mutationCache, optionsRef.current),\n )\n if (result.current !== nextResult) {\n result.current = nextResult\n notifyManager.schedule(onStoreChange)\n }\n }),\n [mutationCache],\n ),\n () => result.current,\n () => result.current,\n )!\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AAEvB,wBAAgD;AAChD,iCAA+B;AASxB,SAAS,cACd,SACA,aACQ;AACR,QAAM,aAAS,2CAAe,WAAW;AACzC,SAAO;AAAA,IACL,EAAE,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE;AACJ;AAOA,SAAS,UACP,eACA,SACgB;AAChB,SAAO,cACJ,QAAQ,QAAQ,OAAO,EACvB;AAAA,IACC,CAAC,aACE,QAAQ,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS;AAAA,EAC1D;AACJ;AAEO,SAAS,iBACd,UAAyC,CAAC,GAC1C,aACgB;AAChB,QAAM,oBAAgB,2CAAe,WAAW,EAAE,iBAAiB;AACnE,QAAM,aAAmB,aAAO,OAAO;AACvC,QAAM,SAAe,aAAuB;
|
|
1
|
+
{"version":3,"sources":["../../src/useMutationState.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { notifyManager, replaceEqualDeep } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n Mutation,\n MutationCache,\n MutationFilters,\n MutationState,\n QueryClient,\n} from '@tanstack/query-core'\n\nexport function useIsMutating(\n filters?: MutationFilters,\n queryClient?: QueryClient,\n): number {\n const client = useQueryClient(queryClient)\n return useMutationState(\n { filters: { ...filters, status: 'pending' } },\n client,\n ).length\n}\n\ntype MutationStateOptions<TResult = MutationState> = {\n filters?: MutationFilters\n select?: (mutation: Mutation) => TResult\n}\n\nfunction getResult<TResult = MutationState>(\n mutationCache: MutationCache,\n options: MutationStateOptions<TResult>,\n): Array<TResult> {\n return mutationCache\n .findAll(options.filters)\n .map(\n (mutation): TResult =>\n (options.select ? options.select(mutation) : mutation.state) as TResult,\n )\n}\n\nexport function useMutationState<TResult = MutationState>(\n options: MutationStateOptions<TResult> = {},\n queryClient?: QueryClient,\n): Array<TResult> {\n const mutationCache = useQueryClient(queryClient).getMutationCache()\n const optionsRef = React.useRef(options)\n const result = React.useRef<Array<TResult>>(null)\n if (!result.current) {\n result.current = getResult(mutationCache, options)\n }\n\n React.useEffect(() => {\n optionsRef.current = options\n })\n\n return React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n mutationCache.subscribe(() => {\n const nextResult = replaceEqualDeep(\n result.current,\n getResult(mutationCache, optionsRef.current),\n )\n if (result.current !== nextResult) {\n result.current = nextResult\n notifyManager.schedule(onStoreChange)\n }\n }),\n [mutationCache],\n ),\n () => result.current,\n () => result.current,\n )!\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AAEvB,wBAAgD;AAChD,iCAA+B;AASxB,SAAS,cACd,SACA,aACQ;AACR,QAAM,aAAS,2CAAe,WAAW;AACzC,SAAO;AAAA,IACL,EAAE,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE;AACJ;AAOA,SAAS,UACP,eACA,SACgB;AAChB,SAAO,cACJ,QAAQ,QAAQ,OAAO,EACvB;AAAA,IACC,CAAC,aACE,QAAQ,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS;AAAA,EAC1D;AACJ;AAEO,SAAS,iBACd,UAAyC,CAAC,GAC1C,aACgB;AAChB,QAAM,oBAAgB,2CAAe,WAAW,EAAE,iBAAiB;AACnE,QAAM,aAAmB,aAAO,OAAO;AACvC,QAAM,SAAe,aAAuB,IAAI;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,UAAU,UAAU,eAAe,OAAO;AAAA,EACnD;AAEA,EAAM,gBAAU,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,CAAC;AAED,SAAa;AAAA,IACL;AAAA,MACJ,CAAC,kBACC,cAAc,UAAU,MAAM;AAC5B,cAAM,iBAAa;AAAA,UACjB,OAAO;AAAA,UACP,UAAU,eAAe,WAAW,OAAO;AAAA,QAC7C;AACA,YAAI,OAAO,YAAY,YAAY;AACjC,iBAAO,UAAU;AACjB,0CAAc,SAAS,aAAa;AAAA,QACtC;AAAA,MACF,CAAC;AAAA,MACH,CAAC,aAAa;AAAA,IAChB;AAAA,IACA,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,EACf;AACF;","names":[]}
|
|
@@ -19,7 +19,7 @@ function getResult(mutationCache, options) {
|
|
|
19
19
|
function useMutationState(options = {}, queryClient) {
|
|
20
20
|
const mutationCache = useQueryClient(queryClient).getMutationCache();
|
|
21
21
|
const optionsRef = React.useRef(options);
|
|
22
|
-
const result = React.useRef();
|
|
22
|
+
const result = React.useRef(null);
|
|
23
23
|
if (!result.current) {
|
|
24
24
|
result.current = getResult(mutationCache, options);
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/useMutationState.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { notifyManager, replaceEqualDeep } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n Mutation,\n MutationCache,\n MutationFilters,\n MutationState,\n QueryClient,\n} from '@tanstack/query-core'\n\nexport function useIsMutating(\n filters?: MutationFilters,\n queryClient?: QueryClient,\n): number {\n const client = useQueryClient(queryClient)\n return useMutationState(\n { filters: { ...filters, status: 'pending' } },\n client,\n ).length\n}\n\ntype MutationStateOptions<TResult = MutationState> = {\n filters?: MutationFilters\n select?: (mutation: Mutation) => TResult\n}\n\nfunction getResult<TResult = MutationState>(\n mutationCache: MutationCache,\n options: MutationStateOptions<TResult>,\n): Array<TResult> {\n return mutationCache\n .findAll(options.filters)\n .map(\n (mutation): TResult =>\n (options.select ? options.select(mutation) : mutation.state) as TResult,\n )\n}\n\nexport function useMutationState<TResult = MutationState>(\n options: MutationStateOptions<TResult> = {},\n queryClient?: QueryClient,\n): Array<TResult> {\n const mutationCache = useQueryClient(queryClient).getMutationCache()\n const optionsRef = React.useRef(options)\n const result = React.useRef<Array<TResult>>()\n if (!result.current) {\n result.current = getResult(mutationCache, options)\n }\n\n React.useEffect(() => {\n optionsRef.current = options\n })\n\n return React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n mutationCache.subscribe(() => {\n const nextResult = replaceEqualDeep(\n result.current,\n getResult(mutationCache, optionsRef.current),\n )\n if (result.current !== nextResult) {\n result.current = nextResult\n notifyManager.schedule(onStoreChange)\n }\n }),\n [mutationCache],\n ),\n () => result.current,\n () => result.current,\n )!\n}\n"],"mappings":";;;AACA,YAAY,WAAW;AAEvB,SAAS,eAAe,wBAAwB;AAChD,SAAS,sBAAsB;AASxB,SAAS,cACd,SACA,aACQ;AACR,QAAM,SAAS,eAAe,WAAW;AACzC,SAAO;AAAA,IACL,EAAE,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE;AACJ;AAOA,SAAS,UACP,eACA,SACgB;AAChB,SAAO,cACJ,QAAQ,QAAQ,OAAO,EACvB;AAAA,IACC,CAAC,aACE,QAAQ,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS;AAAA,EAC1D;AACJ;AAEO,SAAS,iBACd,UAAyC,CAAC,GAC1C,aACgB;AAChB,QAAM,gBAAgB,eAAe,WAAW,EAAE,iBAAiB;AACnE,QAAM,aAAmB,aAAO,OAAO;AACvC,QAAM,SAAe,aAAuB;
|
|
1
|
+
{"version":3,"sources":["../../src/useMutationState.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { notifyManager, replaceEqualDeep } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n Mutation,\n MutationCache,\n MutationFilters,\n MutationState,\n QueryClient,\n} from '@tanstack/query-core'\n\nexport function useIsMutating(\n filters?: MutationFilters,\n queryClient?: QueryClient,\n): number {\n const client = useQueryClient(queryClient)\n return useMutationState(\n { filters: { ...filters, status: 'pending' } },\n client,\n ).length\n}\n\ntype MutationStateOptions<TResult = MutationState> = {\n filters?: MutationFilters\n select?: (mutation: Mutation) => TResult\n}\n\nfunction getResult<TResult = MutationState>(\n mutationCache: MutationCache,\n options: MutationStateOptions<TResult>,\n): Array<TResult> {\n return mutationCache\n .findAll(options.filters)\n .map(\n (mutation): TResult =>\n (options.select ? options.select(mutation) : mutation.state) as TResult,\n )\n}\n\nexport function useMutationState<TResult = MutationState>(\n options: MutationStateOptions<TResult> = {},\n queryClient?: QueryClient,\n): Array<TResult> {\n const mutationCache = useQueryClient(queryClient).getMutationCache()\n const optionsRef = React.useRef(options)\n const result = React.useRef<Array<TResult>>(null)\n if (!result.current) {\n result.current = getResult(mutationCache, options)\n }\n\n React.useEffect(() => {\n optionsRef.current = options\n })\n\n return React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n mutationCache.subscribe(() => {\n const nextResult = replaceEqualDeep(\n result.current,\n getResult(mutationCache, optionsRef.current),\n )\n if (result.current !== nextResult) {\n result.current = nextResult\n notifyManager.schedule(onStoreChange)\n }\n }),\n [mutationCache],\n ),\n () => result.current,\n () => result.current,\n )!\n}\n"],"mappings":";;;AACA,YAAY,WAAW;AAEvB,SAAS,eAAe,wBAAwB;AAChD,SAAS,sBAAsB;AASxB,SAAS,cACd,SACA,aACQ;AACR,QAAM,SAAS,eAAe,WAAW;AACzC,SAAO;AAAA,IACL,EAAE,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE;AACJ;AAOA,SAAS,UACP,eACA,SACgB;AAChB,SAAO,cACJ,QAAQ,QAAQ,OAAO,EACvB;AAAA,IACC,CAAC,aACE,QAAQ,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS;AAAA,EAC1D;AACJ;AAEO,SAAS,iBACd,UAAyC,CAAC,GAC1C,aACgB;AAChB,QAAM,gBAAgB,eAAe,WAAW,EAAE,iBAAiB;AACnE,QAAM,aAAmB,aAAO,OAAO;AACvC,QAAM,SAAe,aAAuB,IAAI;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,UAAU,UAAU,eAAe,OAAO;AAAA,EACnD;AAEA,EAAM,gBAAU,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,CAAC;AAED,SAAa;AAAA,IACL;AAAA,MACJ,CAAC,kBACC,cAAc,UAAU,MAAM;AAC5B,cAAM,aAAa;AAAA,UACjB,OAAO;AAAA,UACP,UAAU,eAAe,WAAW,OAAO;AAAA,QAC7C;AACA,YAAI,OAAO,YAAY,YAAY;AACjC,iBAAO,UAAU;AACjB,wBAAc,SAAS,aAAa;AAAA,QACtC;AAAA,MACF,CAAC;AAAA,MACH,CAAC,aAAa;AAAA,IAChB;AAAA,IACA,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,EACf;AACF;","names":[]}
|
|
@@ -9,6 +9,6 @@ interface HydrationBoundaryProps {
|
|
|
9
9
|
children?: React.ReactNode;
|
|
10
10
|
queryClient?: QueryClient;
|
|
11
11
|
}
|
|
12
|
-
declare const HydrationBoundary: ({ children, options, state, queryClient, }: HydrationBoundaryProps) => React.ReactElement<
|
|
12
|
+
declare const HydrationBoundary: ({ children, options, state, queryClient, }: HydrationBoundaryProps) => React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
13
13
|
|
|
14
14
|
export { HydrationBoundary, type HydrationBoundaryProps };
|
|
@@ -9,6 +9,6 @@ interface HydrationBoundaryProps {
|
|
|
9
9
|
children?: React.ReactNode;
|
|
10
10
|
queryClient?: QueryClient;
|
|
11
11
|
}
|
|
12
|
-
declare const HydrationBoundary: ({ children, options, state, queryClient, }: HydrationBoundaryProps) => React.ReactElement<
|
|
12
|
+
declare const HydrationBoundary: ({ children, options, state, queryClient, }: HydrationBoundaryProps) => React.ReactElement<unknown, string | React.JSXElementConstructor<any>>;
|
|
13
13
|
|
|
14
14
|
export { HydrationBoundary, type HydrationBoundaryProps };
|
|
@@ -53,7 +53,7 @@ function getResult(mutationCache, options) {
|
|
|
53
53
|
function useMutationState(options = {}, queryClient) {
|
|
54
54
|
const mutationCache = (0, import_QueryClientProvider.useQueryClient)(queryClient).getMutationCache();
|
|
55
55
|
const optionsRef = React.useRef(options);
|
|
56
|
-
const result = React.useRef();
|
|
56
|
+
const result = React.useRef(null);
|
|
57
57
|
if (!result.current) {
|
|
58
58
|
result.current = getResult(mutationCache, options);
|
|
59
59
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/useMutationState.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { notifyManager, replaceEqualDeep } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n Mutation,\n MutationCache,\n MutationFilters,\n MutationState,\n QueryClient,\n} from '@tanstack/query-core'\n\nexport function useIsMutating(\n filters?: MutationFilters,\n queryClient?: QueryClient,\n): number {\n const client = useQueryClient(queryClient)\n return useMutationState(\n { filters: { ...filters, status: 'pending' } },\n client,\n ).length\n}\n\ntype MutationStateOptions<TResult = MutationState> = {\n filters?: MutationFilters\n select?: (mutation: Mutation) => TResult\n}\n\nfunction getResult<TResult = MutationState>(\n mutationCache: MutationCache,\n options: MutationStateOptions<TResult>,\n): Array<TResult> {\n return mutationCache\n .findAll(options.filters)\n .map(\n (mutation): TResult =>\n (options.select ? options.select(mutation) : mutation.state) as TResult,\n )\n}\n\nexport function useMutationState<TResult = MutationState>(\n options: MutationStateOptions<TResult> = {},\n queryClient?: QueryClient,\n): Array<TResult> {\n const mutationCache = useQueryClient(queryClient).getMutationCache()\n const optionsRef = React.useRef(options)\n const result = React.useRef<Array<TResult>>()\n if (!result.current) {\n result.current = getResult(mutationCache, options)\n }\n\n React.useEffect(() => {\n optionsRef.current = options\n })\n\n return React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n mutationCache.subscribe(() => {\n const nextResult = replaceEqualDeep(\n result.current,\n getResult(mutationCache, optionsRef.current),\n )\n if (result.current !== nextResult) {\n result.current = nextResult\n notifyManager.schedule(onStoreChange)\n }\n }),\n [mutationCache],\n ),\n () => result.current,\n () => result.current,\n )!\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AAEvB,wBAAgD;AAChD,iCAA+B;AASxB,SAAS,cACd,SACA,aACQ;AACR,QAAM,aAAS,2CAAe,WAAW;AACzC,SAAO;AAAA,IACL,EAAE,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE;AACJ;AAOA,SAAS,UACP,eACA,SACgB;AAChB,SAAO,cACJ,QAAQ,QAAQ,OAAO,EACvB;AAAA,IACC,CAAC,aACE,QAAQ,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS;AAAA,EAC1D;AACJ;AAEO,SAAS,iBACd,UAAyC,CAAC,GAC1C,aACgB;AAChB,QAAM,oBAAgB,2CAAe,WAAW,EAAE,iBAAiB;AACnE,QAAM,aAAmB,aAAO,OAAO;AACvC,QAAM,SAAe,aAAuB;
|
|
1
|
+
{"version":3,"sources":["../../src/useMutationState.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { notifyManager, replaceEqualDeep } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n Mutation,\n MutationCache,\n MutationFilters,\n MutationState,\n QueryClient,\n} from '@tanstack/query-core'\n\nexport function useIsMutating(\n filters?: MutationFilters,\n queryClient?: QueryClient,\n): number {\n const client = useQueryClient(queryClient)\n return useMutationState(\n { filters: { ...filters, status: 'pending' } },\n client,\n ).length\n}\n\ntype MutationStateOptions<TResult = MutationState> = {\n filters?: MutationFilters\n select?: (mutation: Mutation) => TResult\n}\n\nfunction getResult<TResult = MutationState>(\n mutationCache: MutationCache,\n options: MutationStateOptions<TResult>,\n): Array<TResult> {\n return mutationCache\n .findAll(options.filters)\n .map(\n (mutation): TResult =>\n (options.select ? options.select(mutation) : mutation.state) as TResult,\n )\n}\n\nexport function useMutationState<TResult = MutationState>(\n options: MutationStateOptions<TResult> = {},\n queryClient?: QueryClient,\n): Array<TResult> {\n const mutationCache = useQueryClient(queryClient).getMutationCache()\n const optionsRef = React.useRef(options)\n const result = React.useRef<Array<TResult>>(null)\n if (!result.current) {\n result.current = getResult(mutationCache, options)\n }\n\n React.useEffect(() => {\n optionsRef.current = options\n })\n\n return React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n mutationCache.subscribe(() => {\n const nextResult = replaceEqualDeep(\n result.current,\n getResult(mutationCache, optionsRef.current),\n )\n if (result.current !== nextResult) {\n result.current = nextResult\n notifyManager.schedule(onStoreChange)\n }\n }),\n [mutationCache],\n ),\n () => result.current,\n () => result.current,\n )!\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,YAAuB;AAEvB,wBAAgD;AAChD,iCAA+B;AASxB,SAAS,cACd,SACA,aACQ;AACR,QAAM,aAAS,2CAAe,WAAW;AACzC,SAAO;AAAA,IACL,EAAE,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE;AACJ;AAOA,SAAS,UACP,eACA,SACgB;AAChB,SAAO,cACJ,QAAQ,QAAQ,OAAO,EACvB;AAAA,IACC,CAAC,aACE,QAAQ,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS;AAAA,EAC1D;AACJ;AAEO,SAAS,iBACd,UAAyC,CAAC,GAC1C,aACgB;AAChB,QAAM,oBAAgB,2CAAe,WAAW,EAAE,iBAAiB;AACnE,QAAM,aAAmB,aAAO,OAAO;AACvC,QAAM,SAAe,aAAuB,IAAI;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,UAAU,UAAU,eAAe,OAAO;AAAA,EACnD;AAEA,EAAM,gBAAU,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,CAAC;AAED,SAAa;AAAA,IACL;AAAA,MACJ,CAAC,kBACC,cAAc,UAAU,MAAM;AAC5B,cAAM,iBAAa;AAAA,UACjB,OAAO;AAAA,UACP,UAAU,eAAe,WAAW,OAAO;AAAA,QAC7C;AACA,YAAI,OAAO,YAAY,YAAY;AACjC,iBAAO,UAAU;AACjB,0CAAc,SAAS,aAAa;AAAA,QACtC;AAAA,MACF,CAAC;AAAA,MACH,CAAC,aAAa;AAAA,IAChB;AAAA,IACA,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,EACf;AACF;","names":[]}
|
|
@@ -19,7 +19,7 @@ function getResult(mutationCache, options) {
|
|
|
19
19
|
function useMutationState(options = {}, queryClient) {
|
|
20
20
|
const mutationCache = useQueryClient(queryClient).getMutationCache();
|
|
21
21
|
const optionsRef = React.useRef(options);
|
|
22
|
-
const result = React.useRef();
|
|
22
|
+
const result = React.useRef(null);
|
|
23
23
|
if (!result.current) {
|
|
24
24
|
result.current = getResult(mutationCache, options);
|
|
25
25
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/useMutationState.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { notifyManager, replaceEqualDeep } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n Mutation,\n MutationCache,\n MutationFilters,\n MutationState,\n QueryClient,\n} from '@tanstack/query-core'\n\nexport function useIsMutating(\n filters?: MutationFilters,\n queryClient?: QueryClient,\n): number {\n const client = useQueryClient(queryClient)\n return useMutationState(\n { filters: { ...filters, status: 'pending' } },\n client,\n ).length\n}\n\ntype MutationStateOptions<TResult = MutationState> = {\n filters?: MutationFilters\n select?: (mutation: Mutation) => TResult\n}\n\nfunction getResult<TResult = MutationState>(\n mutationCache: MutationCache,\n options: MutationStateOptions<TResult>,\n): Array<TResult> {\n return mutationCache\n .findAll(options.filters)\n .map(\n (mutation): TResult =>\n (options.select ? options.select(mutation) : mutation.state) as TResult,\n )\n}\n\nexport function useMutationState<TResult = MutationState>(\n options: MutationStateOptions<TResult> = {},\n queryClient?: QueryClient,\n): Array<TResult> {\n const mutationCache = useQueryClient(queryClient).getMutationCache()\n const optionsRef = React.useRef(options)\n const result = React.useRef<Array<TResult>>()\n if (!result.current) {\n result.current = getResult(mutationCache, options)\n }\n\n React.useEffect(() => {\n optionsRef.current = options\n })\n\n return React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n mutationCache.subscribe(() => {\n const nextResult = replaceEqualDeep(\n result.current,\n getResult(mutationCache, optionsRef.current),\n )\n if (result.current !== nextResult) {\n result.current = nextResult\n notifyManager.schedule(onStoreChange)\n }\n }),\n [mutationCache],\n ),\n () => result.current,\n () => result.current,\n )!\n}\n"],"mappings":";;;AACA,YAAY,WAAW;AAEvB,SAAS,eAAe,wBAAwB;AAChD,SAAS,sBAAsB;AASxB,SAAS,cACd,SACA,aACQ;AACR,QAAM,SAAS,eAAe,WAAW;AACzC,SAAO;AAAA,IACL,EAAE,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE;AACJ;AAOA,SAAS,UACP,eACA,SACgB;AAChB,SAAO,cACJ,QAAQ,QAAQ,OAAO,EACvB;AAAA,IACC,CAAC,aACE,QAAQ,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS;AAAA,EAC1D;AACJ;AAEO,SAAS,iBACd,UAAyC,CAAC,GAC1C,aACgB;AAChB,QAAM,gBAAgB,eAAe,WAAW,EAAE,iBAAiB;AACnE,QAAM,aAAmB,aAAO,OAAO;AACvC,QAAM,SAAe,aAAuB;
|
|
1
|
+
{"version":3,"sources":["../../src/useMutationState.ts"],"sourcesContent":["'use client'\nimport * as React from 'react'\n\nimport { notifyManager, replaceEqualDeep } from '@tanstack/query-core'\nimport { useQueryClient } from './QueryClientProvider'\nimport type {\n Mutation,\n MutationCache,\n MutationFilters,\n MutationState,\n QueryClient,\n} from '@tanstack/query-core'\n\nexport function useIsMutating(\n filters?: MutationFilters,\n queryClient?: QueryClient,\n): number {\n const client = useQueryClient(queryClient)\n return useMutationState(\n { filters: { ...filters, status: 'pending' } },\n client,\n ).length\n}\n\ntype MutationStateOptions<TResult = MutationState> = {\n filters?: MutationFilters\n select?: (mutation: Mutation) => TResult\n}\n\nfunction getResult<TResult = MutationState>(\n mutationCache: MutationCache,\n options: MutationStateOptions<TResult>,\n): Array<TResult> {\n return mutationCache\n .findAll(options.filters)\n .map(\n (mutation): TResult =>\n (options.select ? options.select(mutation) : mutation.state) as TResult,\n )\n}\n\nexport function useMutationState<TResult = MutationState>(\n options: MutationStateOptions<TResult> = {},\n queryClient?: QueryClient,\n): Array<TResult> {\n const mutationCache = useQueryClient(queryClient).getMutationCache()\n const optionsRef = React.useRef(options)\n const result = React.useRef<Array<TResult>>(null)\n if (!result.current) {\n result.current = getResult(mutationCache, options)\n }\n\n React.useEffect(() => {\n optionsRef.current = options\n })\n\n return React.useSyncExternalStore(\n React.useCallback(\n (onStoreChange) =>\n mutationCache.subscribe(() => {\n const nextResult = replaceEqualDeep(\n result.current,\n getResult(mutationCache, optionsRef.current),\n )\n if (result.current !== nextResult) {\n result.current = nextResult\n notifyManager.schedule(onStoreChange)\n }\n }),\n [mutationCache],\n ),\n () => result.current,\n () => result.current,\n )!\n}\n"],"mappings":";;;AACA,YAAY,WAAW;AAEvB,SAAS,eAAe,wBAAwB;AAChD,SAAS,sBAAsB;AASxB,SAAS,cACd,SACA,aACQ;AACR,QAAM,SAAS,eAAe,WAAW;AACzC,SAAO;AAAA,IACL,EAAE,SAAS,EAAE,GAAG,SAAS,QAAQ,UAAU,EAAE;AAAA,IAC7C;AAAA,EACF,EAAE;AACJ;AAOA,SAAS,UACP,eACA,SACgB;AAChB,SAAO,cACJ,QAAQ,QAAQ,OAAO,EACvB;AAAA,IACC,CAAC,aACE,QAAQ,SAAS,QAAQ,OAAO,QAAQ,IAAI,SAAS;AAAA,EAC1D;AACJ;AAEO,SAAS,iBACd,UAAyC,CAAC,GAC1C,aACgB;AAChB,QAAM,gBAAgB,eAAe,WAAW,EAAE,iBAAiB;AACnE,QAAM,aAAmB,aAAO,OAAO;AACvC,QAAM,SAAe,aAAuB,IAAI;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,WAAO,UAAU,UAAU,eAAe,OAAO;AAAA,EACnD;AAEA,EAAM,gBAAU,MAAM;AACpB,eAAW,UAAU;AAAA,EACvB,CAAC;AAED,SAAa;AAAA,IACL;AAAA,MACJ,CAAC,kBACC,cAAc,UAAU,MAAM;AAC5B,cAAM,aAAa;AAAA,UACjB,OAAO;AAAA,UACP,UAAU,eAAe,WAAW,OAAO;AAAA,QAC7C;AACA,YAAI,OAAO,YAAY,YAAY;AACjC,iBAAO,UAAU;AACjB,wBAAc,SAAS,aAAa;AAAA,QACtC;AAAA,MACF,CAAC;AAAA,MACH,CAAC,aAAa;AAAA,IAChB;AAAA,IACA,MAAM,OAAO;AAAA,IACb,MAAM,OAAO;AAAA,EACf;AACF;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tanstack/react-query",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.39.0",
|
|
4
4
|
"description": "Hooks for managing, caching and syncing asynchronous and remote data in React",
|
|
5
5
|
"author": "tannerlinsley",
|
|
6
6
|
"license": "MIT",
|
|
@@ -44,11 +44,12 @@
|
|
|
44
44
|
"@tanstack/query-core": "5.38.0"
|
|
45
45
|
},
|
|
46
46
|
"devDependencies": {
|
|
47
|
-
"@types/react": "
|
|
48
|
-
"@types/react-dom": "
|
|
47
|
+
"@types/react": "npm:types-react@rc",
|
|
48
|
+
"@types/react-dom": "npm:types-react-dom@rc",
|
|
49
49
|
"@vitejs/plugin-react": "^4.2.1",
|
|
50
|
-
"react": "^
|
|
51
|
-
"react
|
|
50
|
+
"eslint-plugin-react-compiler": "^0.0.0-experimental-c8b3f72-20240517",
|
|
51
|
+
"react": "19.0.0-rc-4c2e457c7c-20240522",
|
|
52
|
+
"react-dom": "19.0.0-rc-4c2e457c7c-20240522",
|
|
52
53
|
"react-error-boundary": "^4.0.13"
|
|
53
54
|
},
|
|
54
55
|
"peerDependencies": {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { afterAll, beforeAll, describe, expect, it, vi } from 'vitest'
|
|
2
|
-
import
|
|
3
|
-
import
|
|
2
|
+
import { hydrateRoot } from 'react-dom/client'
|
|
3
|
+
import { act } from 'react'
|
|
4
4
|
import * as ReactDOMServer from 'react-dom/server'
|
|
5
5
|
|
|
6
6
|
import {
|
|
@@ -14,9 +14,8 @@ import { createQueryClient, setIsServer, sleep } from './utils'
|
|
|
14
14
|
|
|
15
15
|
const ReactHydrate = (element: React.ReactElement, container: Element) => {
|
|
16
16
|
let root: any
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
root = ReactDOM.hydrateRoot(container, element)
|
|
17
|
+
act(() => {
|
|
18
|
+
root = hydrateRoot(container, element)
|
|
20
19
|
})
|
|
21
20
|
return () => {
|
|
22
21
|
root.unmount()
|
|
@@ -111,11 +110,8 @@ describe('Server side rendering with de/rehydration', () => {
|
|
|
111
110
|
)
|
|
112
111
|
|
|
113
112
|
// Check that we have no React hydration mismatches
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
1,
|
|
117
|
-
'Warning: You are importing hydrateRoot from "react-dom" which is not supported. You should instead import it from "react-dom/client".',
|
|
118
|
-
)
|
|
113
|
+
expect(consoleMock).toHaveBeenCalledTimes(0)
|
|
114
|
+
|
|
119
115
|
expect(fetchDataSuccess).toHaveBeenCalledTimes(2)
|
|
120
116
|
expect(el.innerHTML).toBe(expectedMarkup)
|
|
121
117
|
|
|
@@ -189,8 +185,7 @@ describe('Server side rendering with de/rehydration', () => {
|
|
|
189
185
|
el,
|
|
190
186
|
)
|
|
191
187
|
|
|
192
|
-
|
|
193
|
-
expect(consoleMock).toHaveBeenCalledTimes(1)
|
|
188
|
+
expect(consoleMock).toHaveBeenCalledTimes(0)
|
|
194
189
|
expect(fetchDataError).toHaveBeenCalledTimes(2)
|
|
195
190
|
expect(el.innerHTML).toBe(expectedMarkup)
|
|
196
191
|
await sleep(50)
|
|
@@ -261,11 +256,7 @@ describe('Server side rendering with de/rehydration', () => {
|
|
|
261
256
|
)
|
|
262
257
|
|
|
263
258
|
// Check that we have no React hydration mismatches
|
|
264
|
-
|
|
265
|
-
expect(consoleMock).toHaveBeenNthCalledWith(
|
|
266
|
-
1,
|
|
267
|
-
'Warning: You are importing hydrateRoot from "react-dom" which is not supported. You should instead import it from "react-dom/client".',
|
|
268
|
-
)
|
|
259
|
+
expect(consoleMock).toHaveBeenCalledTimes(0)
|
|
269
260
|
expect(fetchDataSuccess).toHaveBeenCalledTimes(1)
|
|
270
261
|
expect(el.innerHTML).toBe(expectedMarkup)
|
|
271
262
|
await sleep(50)
|
|
@@ -257,8 +257,8 @@ describe('useSuspenseQuery', () => {
|
|
|
257
257
|
|
|
258
258
|
await waitFor(() => rendered.getByText('rendered'))
|
|
259
259
|
|
|
260
|
-
expect(consoleMock).
|
|
261
|
-
|
|
260
|
+
expect(consoleMock.mock.calls[0]?.[1]).toStrictEqual(
|
|
261
|
+
new Error('Suspense Error Bingo'),
|
|
262
262
|
)
|
|
263
263
|
|
|
264
264
|
consoleMock.mockRestore()
|
|
@@ -595,8 +595,8 @@ describe('useSuspenseQuery', () => {
|
|
|
595
595
|
fireEvent.click(rendered.getByLabelText('fail'))
|
|
596
596
|
// render error boundary fallback (error boundary)
|
|
597
597
|
await waitFor(() => rendered.getByText('error boundary'))
|
|
598
|
-
expect(consoleMock).
|
|
599
|
-
|
|
598
|
+
expect(consoleMock.mock.calls[0]?.[1]).toStrictEqual(
|
|
599
|
+
new Error('Suspense Error Bingo'),
|
|
600
600
|
)
|
|
601
601
|
|
|
602
602
|
consoleMock.mockRestore()
|
|
@@ -666,8 +666,8 @@ describe('useSuspenseQuery', () => {
|
|
|
666
666
|
fireEvent.click(rendered.getByLabelText('fail'))
|
|
667
667
|
// render error boundary fallback (error boundary)
|
|
668
668
|
await waitFor(() => rendered.getByText('error boundary'))
|
|
669
|
-
expect(consoleMock).
|
|
670
|
-
|
|
669
|
+
expect(consoleMock.mock.calls[0]?.[1]).toStrictEqual(
|
|
670
|
+
new Error('Suspense Error Bingo'),
|
|
671
671
|
)
|
|
672
672
|
|
|
673
673
|
consoleMock.mockRestore()
|
|
@@ -715,7 +715,7 @@ describe('useSuspenseQuery', () => {
|
|
|
715
715
|
)
|
|
716
716
|
|
|
717
717
|
expect(renders).toBe(2)
|
|
718
|
-
expect(rendered.queryByText('rendered')).not.toBeNull()
|
|
718
|
+
await waitFor(() => expect(rendered.queryByText('rendered')).not.toBeNull())
|
|
719
719
|
})
|
|
720
720
|
|
|
721
721
|
it('should not throw background errors to the error boundary', async () => {
|
|
@@ -1036,8 +1036,8 @@ describe('useSuspenseQueries', () => {
|
|
|
1036
1036
|
|
|
1037
1037
|
await waitFor(() => rendered.getByText('error boundary'))
|
|
1038
1038
|
|
|
1039
|
-
expect(consoleMock).
|
|
1040
|
-
|
|
1039
|
+
expect(consoleMock.mock.calls[0]?.[1]).toStrictEqual(
|
|
1040
|
+
new Error('Suspense Error Bingo'),
|
|
1041
1041
|
)
|
|
1042
1042
|
|
|
1043
1043
|
consoleMock.mockRestore()
|
|
@@ -667,14 +667,15 @@ describe('useMutation', () => {
|
|
|
667
667
|
})
|
|
668
668
|
|
|
669
669
|
it('should be able to throw an error when throwOnError is set to true', async () => {
|
|
670
|
+
const err = new Error('Expected mock error. All is well!')
|
|
671
|
+
err.stack = ''
|
|
672
|
+
|
|
670
673
|
const consoleMock = vi
|
|
671
674
|
.spyOn(console, 'error')
|
|
672
675
|
.mockImplementation(() => undefined)
|
|
673
676
|
function Page() {
|
|
674
677
|
const { mutate } = useMutation<string, Error>({
|
|
675
678
|
mutationFn: () => {
|
|
676
|
-
const err = new Error('Expected mock error. All is well!')
|
|
677
|
-
err.stack = ''
|
|
678
679
|
return Promise.reject(err)
|
|
679
680
|
},
|
|
680
681
|
throwOnError: true,
|
|
@@ -706,9 +707,7 @@ describe('useMutation', () => {
|
|
|
706
707
|
expect(queryByText('error')).not.toBeNull()
|
|
707
708
|
})
|
|
708
709
|
|
|
709
|
-
expect(consoleMock).
|
|
710
|
-
expect.objectContaining(new Error('Expected mock error. All is well!')),
|
|
711
|
-
)
|
|
710
|
+
expect(consoleMock.mock.calls[0]?.[1]).toBe(err)
|
|
712
711
|
|
|
713
712
|
consoleMock.mockRestore()
|
|
714
713
|
})
|
|
@@ -719,15 +718,14 @@ describe('useMutation', () => {
|
|
|
719
718
|
.mockImplementation(() => undefined)
|
|
720
719
|
let boundary = false
|
|
721
720
|
function Page() {
|
|
722
|
-
const { mutate, error } = useMutation<string
|
|
721
|
+
const { mutate, error } = useMutation<string>({
|
|
723
722
|
mutationFn: () => {
|
|
724
723
|
const err = new Error('mock error')
|
|
725
724
|
err.stack = ''
|
|
726
725
|
return Promise.reject(err)
|
|
727
726
|
},
|
|
728
727
|
throwOnError: () => {
|
|
729
|
-
|
|
730
|
-
return !boundary
|
|
728
|
+
return boundary
|
|
731
729
|
},
|
|
732
730
|
})
|
|
733
731
|
|
|
@@ -759,6 +757,7 @@ describe('useMutation', () => {
|
|
|
759
757
|
})
|
|
760
758
|
|
|
761
759
|
// second error goes to boundary
|
|
760
|
+
boundary = true
|
|
762
761
|
fireEvent.click(getByText('mutate'))
|
|
763
762
|
await waitFor(() => {
|
|
764
763
|
expect(queryByText('error boundary')).not.toBeNull()
|
package/src/useMutationState.ts
CHANGED
|
@@ -45,7 +45,7 @@ export function useMutationState<TResult = MutationState>(
|
|
|
45
45
|
): Array<TResult> {
|
|
46
46
|
const mutationCache = useQueryClient(queryClient).getMutationCache()
|
|
47
47
|
const optionsRef = React.useRef(options)
|
|
48
|
-
const result = React.useRef<Array<TResult>>()
|
|
48
|
+
const result = React.useRef<Array<TResult>>(null)
|
|
49
49
|
if (!result.current) {
|
|
50
50
|
result.current = getResult(mutationCache, options)
|
|
51
51
|
}
|