@effector-tanstack-query/core 0.1.1 → 0.3.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/dist/createInfiniteQuery.cjs.map +1 -1
- package/dist/createInfiniteQuery.d.cts +3 -3
- package/dist/createInfiniteQuery.d.ts +3 -3
- package/dist/createInfiniteQuery.js.map +1 -1
- package/dist/createQuery.cjs +5 -5
- package/dist/createQuery.cjs.map +1 -1
- package/dist/createQuery.d.cts +3 -3
- package/dist/createQuery.d.ts +3 -3
- package/dist/createQuery.js +5 -5
- package/dist/createQuery.js.map +1 -1
- package/dist/index.cjs +5 -0
- package/dist/index.d.cts +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/prefetchQueries.cjs +14 -0
- package/dist/prefetchQueries.cjs.map +1 -0
- package/dist/prefetchQueries.d.cts +59 -0
- package/dist/prefetchQueries.d.ts +59 -0
- package/dist/prefetchQueries.js +12 -0
- package/dist/prefetchQueries.js.map +1 -0
- package/dist/types.d.cts +31 -7
- package/dist/types.d.ts +31 -7
- package/package.json +2 -2
- package/src/createInfiniteQuery.ts +69 -10
- package/src/createQuery.ts +34 -14
- package/src/index.ts +5 -0
- package/src/prefetchQueries.ts +67 -0
- package/src/types.ts +46 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createInfiniteQuery.ts"],"names":["warnMissingName","resolveReactiveRefetchInterval","createBaseQuery","InfiniteQueryObserver","createEvent","createStore","sidConfig","attach","sample","scopeBind","result","enabled"],"mappings":"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","file":"createInfiniteQuery.cjs","sourcesContent":["import { attach, createEvent, createStore, sample, scopeBind } from 'effector'\nimport { InfiniteQueryObserver } from '@tanstack/query-core'\nimport type {\n InfiniteData,\n QueryClient,\n QueryKey,\n} from '@tanstack/query-core'\nimport { createBaseQuery, sidConfig, warnMissingName } from './createBaseQuery'\nimport { resolveReactiveRefetchInterval } from './resolve'\nimport type {\n CreateInfiniteQueryOptions,\n InfiniteQueryResult,\n} from './types'\n\ntype Observer<TQueryFnData, TError, TData, TPageParam> = InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n>\n\ntype ObserverResult<TQueryFnData, TError, TData, TPageParam> = ReturnType<\n Observer<TQueryFnData, TError, TData, TPageParam>['getCurrentResult']\n>\n\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n>(\n options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n): InfiniteQueryResult<TData, TError, TPageParam>\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n>(\n queryClient: QueryClient,\n options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n): InfiniteQueryResult<TData, TError, TPageParam>\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n>(\n arg1:\n | QueryClient\n | CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n arg2?: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n): InfiniteQueryResult<TData, TError, TPageParam> {\n const [explicitClient, options] = parseInfiniteArgs<\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >(arg1, arg2)\n const { queryKey, enabled, name, ...restOptions } = options\n\n if (!name) warnMissingName('createInfiniteQuery')\n\n const reactiveRefetchInterval = resolveReactiveRefetchInterval(\n (restOptions as { refetchInterval?: unknown }).refetchInterval,\n )\n if (reactiveRefetchInterval) {\n delete (restOptions as { refetchInterval?: unknown }).refetchInterval\n }\n\n const base = createBaseQuery<\n TData,\n TError,\n ObserverResult<TQueryFnData, TError, TData, TPageParam>,\n Observer<TQueryFnData, TError, TData, TPageParam>,\n {\n $hasNextPage: ReturnType<typeof createStore<boolean>>\n $hasPreviousPage: ReturnType<typeof createStore<boolean>>\n $isFetchingNextPage: ReturnType<typeof createStore<boolean>>\n $isFetchingPreviousPage: ReturnType<typeof createStore<boolean>>\n $isFetchNextPageError: ReturnType<typeof createStore<boolean>>\n $isFetchPreviousPageError: ReturnType<typeof createStore<boolean>>\n fetchNextPage: ReturnType<typeof createEvent<void>>\n fetchPreviousPage: ReturnType<typeof createEvent<void>>\n }\n >(\n explicitClient,\n { queryKey, enabled, name, reactiveRefetchInterval },\n {\n createObserver: (qc, { queryKey: key, enabled: isEnabled }) =>\n new InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n >(qc, {\n ...restOptions,\n queryKey: key,\n enabled: isEnabled,\n } as any),\n setupExtras: () => {\n const hasNextPageUpdated = createEvent<boolean>()\n const hasPreviousPageUpdated = createEvent<boolean>()\n const isFetchingNextPageUpdated = createEvent<boolean>()\n const isFetchingPreviousPageUpdated = createEvent<boolean>()\n const isFetchNextPageErrorUpdated = createEvent<boolean>()\n const isFetchPreviousPageErrorUpdated = createEvent<boolean>()\n\n const $hasNextPage = createStore(false, {\n ...sidConfig(name, '$hasNextPage'),\n }).on(hasNextPageUpdated, (_, v) => v)\n const $hasPreviousPage = createStore(false, {\n ...sidConfig(name, '$hasPreviousPage'),\n }).on(hasPreviousPageUpdated, (_, v) => v)\n const $isFetchingNextPage = createStore(false, {\n ...sidConfig(name, '$isFetchingNextPage'),\n }).on(isFetchingNextPageUpdated, (_, v) => v)\n const $isFetchingPreviousPage = createStore(false, {\n ...sidConfig(name, '$isFetchingPreviousPage'),\n }).on(isFetchingPreviousPageUpdated, (_, v) => v)\n const $isFetchNextPageError = createStore(false, {\n ...sidConfig(name, '$isFetchNextPageError'),\n }).on(isFetchNextPageErrorUpdated, (_, v) => v)\n const $isFetchPreviousPageError = createStore(false, {\n ...sidConfig(name, '$isFetchPreviousPageError'),\n }).on(isFetchPreviousPageErrorUpdated, (_, v) => v)\n\n const fetchNextPage = createEvent<void>()\n const fetchPreviousPage = createEvent<void>()\n\n return {\n stores: {\n $hasNextPage,\n $hasPreviousPage,\n $isFetchingNextPage,\n $isFetchingPreviousPage,\n $isFetchNextPageError,\n $isFetchPreviousPageError,\n fetchNextPage,\n fetchPreviousPage,\n },\n // Wire fetchNextPage / fetchPreviousPage as scope-aware effects via\n // attach over $observer — same pattern as the rest of createBaseQuery.\n setupEffects: ({ $observer }) => {\n const fetchNextPageFx = attach({\n source: $observer,\n effect: (observer) => {\n if (!observer) return\n observer.fetchNextPage()\n },\n })\n sample({ clock: fetchNextPage, target: fetchNextPageFx })\n\n const fetchPreviousPageFx = attach({\n source: $observer,\n effect: (observer) => {\n if (!observer) return\n observer.fetchPreviousPage()\n },\n })\n sample({ clock: fetchPreviousPage, target: fetchPreviousPageFx })\n },\n bindDispatcher: () => {\n const dispatchHasNextPage = scopeBind(hasNextPageUpdated, {\n safe: true,\n })\n const dispatchHasPreviousPage = scopeBind(hasPreviousPageUpdated, {\n safe: true,\n })\n const dispatchIsFetchingNextPage = scopeBind(\n isFetchingNextPageUpdated,\n { safe: true },\n )\n const dispatchIsFetchingPreviousPage = scopeBind(\n isFetchingPreviousPageUpdated,\n { safe: true },\n )\n const dispatchIsFetchNextPageError = scopeBind(\n isFetchNextPageErrorUpdated,\n { safe: true },\n )\n const dispatchIsFetchPreviousPageError = scopeBind(\n isFetchPreviousPageErrorUpdated,\n { safe: true },\n )\n\n return (result) => {\n dispatchHasNextPage(result.hasNextPage)\n dispatchHasPreviousPage(result.hasPreviousPage)\n dispatchIsFetchingNextPage(result.isFetchingNextPage)\n dispatchIsFetchingPreviousPage(result.isFetchingPreviousPage)\n dispatchIsFetchNextPageError(result.isFetchNextPageError)\n dispatchIsFetchPreviousPageError(result.isFetchPreviousPageError)\n }\n },\n }\n },\n },\n )\n\n // See createQuery.prefetch — same contract, but uses fetchInfiniteQuery so\n // the first page is fetched + cached on the server.\n const prefetch = createEvent<void>()\n const prefetchFx = attach({\n source: {\n qc: base.$queryClient,\n key: base.$resolvedKey,\n enabled: base.$enabled,\n },\n effect: ({ qc, key, enabled }) => {\n if (!qc || !enabled) return\n return qc.fetchInfiniteQuery({\n ...restOptions,\n queryKey: key,\n } as any)\n },\n })\n sample({ clock: prefetch, target: prefetchFx })\n\n const result: InfiniteQueryResult<TData, TError, TPageParam> = {\n $data: base.$data,\n $error: base.$error,\n $status: base.$status,\n $isPending: base.$isPending,\n $isFetching: base.$isFetching,\n $isSuccess: base.$isSuccess,\n $isError: base.$isError,\n $isPlaceholderData: base.$isPlaceholderData,\n $fetchStatus: base.$fetchStatus,\n $hasNextPage: base.$hasNextPage,\n $hasPreviousPage: base.$hasPreviousPage,\n $isFetchingNextPage: base.$isFetchingNextPage,\n $isFetchingPreviousPage: base.$isFetchingPreviousPage,\n $isFetchNextPageError: base.$isFetchNextPageError,\n $isFetchPreviousPageError: base.$isFetchPreviousPageError,\n $observer: base.$observer,\n $queryClient: base.$queryClient,\n fetchNextPage: base.fetchNextPage,\n fetchPreviousPage: base.fetchPreviousPage,\n refresh: base.refresh,\n prefetch,\n mounted: base.mounted,\n unmounted: base.unmounted,\n }\n\n Object.defineProperty(result, '__createObserver', {\n enumerable: false,\n value: (qc: QueryClient, init: { queryKey: any; enabled: boolean }) =>\n new InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n >(qc, {\n ...restOptions,\n queryKey: init.queryKey,\n enabled: init.enabled,\n } as any),\n })\n Object.defineProperty(result, '__resolvedKey', {\n enumerable: false,\n value: base.$resolvedKey,\n })\n Object.defineProperty(result, '__enabled', {\n enumerable: false,\n value: base.$enabled,\n })\n\n return result\n}\n\nfunction parseInfiniteArgs<TQueryFnData, TError, TPageParam, TData>(\n arg1:\n | QueryClient\n | CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n arg2?: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n): [\n QueryClient | null,\n CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n] {\n if (arg2 !== undefined) {\n return [arg1 as QueryClient, arg2]\n }\n return [\n null,\n arg1 as CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n ]\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/createInfiniteQuery.ts"],"names":["warnMissingName","resolveReactiveRefetchInterval","createBaseQuery","InfiniteQueryObserver","createEvent","createStore","sidConfig","attach","sample","scopeBind","result","enabled"],"mappings":"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","file":"createInfiniteQuery.cjs","sourcesContent":["import { attach, createEvent, createStore, sample, scopeBind } from 'effector'\nimport { InfiniteQueryObserver } from '@tanstack/query-core'\nimport type {\n InfiniteData,\n QueryClient,\n QueryKey,\n} from '@tanstack/query-core'\nimport { createBaseQuery, sidConfig, warnMissingName } from './createBaseQuery'\nimport { resolveReactiveRefetchInterval } from './resolve'\nimport type {\n CreateInfiniteQueryOptions,\n EffectorQueryKey,\n InfiniteQueryResult,\n} from './types'\n\ntype Observer<TQueryFnData, TError, TData, TPageParam> = InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n>\n\ntype ObserverResult<TQueryFnData, TError, TData, TPageParam> = ReturnType<\n Observer<TQueryFnData, TError, TData, TPageParam>['getCurrentResult']\n>\n\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n options: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n): InfiniteQueryResult<TData, TError, TPageParam>\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n queryClient: QueryClient,\n options: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n): InfiniteQueryResult<TData, TError, TPageParam>\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n arg1:\n | QueryClient\n | CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n arg2?: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n): InfiniteQueryResult<TData, TError, TPageParam> {\n const [explicitClient, options] = parseInfiniteArgs<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >(arg1, arg2)\n const { queryKey, enabled, name, ...restOptions } = options\n\n if (!name) warnMissingName('createInfiniteQuery')\n\n const reactiveRefetchInterval = resolveReactiveRefetchInterval(\n (restOptions as { refetchInterval?: unknown }).refetchInterval,\n )\n if (reactiveRefetchInterval) {\n delete (restOptions as { refetchInterval?: unknown }).refetchInterval\n }\n\n const base = createBaseQuery<\n TData,\n TError,\n ObserverResult<TQueryFnData, TError, TData, TPageParam>,\n Observer<TQueryFnData, TError, TData, TPageParam>,\n {\n $hasNextPage: ReturnType<typeof createStore<boolean>>\n $hasPreviousPage: ReturnType<typeof createStore<boolean>>\n $isFetchingNextPage: ReturnType<typeof createStore<boolean>>\n $isFetchingPreviousPage: ReturnType<typeof createStore<boolean>>\n $isFetchNextPageError: ReturnType<typeof createStore<boolean>>\n $isFetchPreviousPageError: ReturnType<typeof createStore<boolean>>\n fetchNextPage: ReturnType<typeof createEvent<void>>\n fetchPreviousPage: ReturnType<typeof createEvent<void>>\n }\n >(\n explicitClient,\n { queryKey, enabled, name, reactiveRefetchInterval },\n {\n createObserver: (qc, { queryKey: key, enabled: isEnabled }) =>\n new InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n >(qc, {\n ...restOptions,\n queryKey: key,\n enabled: isEnabled,\n } as any),\n setupExtras: () => {\n const hasNextPageUpdated = createEvent<boolean>()\n const hasPreviousPageUpdated = createEvent<boolean>()\n const isFetchingNextPageUpdated = createEvent<boolean>()\n const isFetchingPreviousPageUpdated = createEvent<boolean>()\n const isFetchNextPageErrorUpdated = createEvent<boolean>()\n const isFetchPreviousPageErrorUpdated = createEvent<boolean>()\n\n const $hasNextPage = createStore(false, {\n ...sidConfig(name, '$hasNextPage'),\n }).on(hasNextPageUpdated, (_, v) => v)\n const $hasPreviousPage = createStore(false, {\n ...sidConfig(name, '$hasPreviousPage'),\n }).on(hasPreviousPageUpdated, (_, v) => v)\n const $isFetchingNextPage = createStore(false, {\n ...sidConfig(name, '$isFetchingNextPage'),\n }).on(isFetchingNextPageUpdated, (_, v) => v)\n const $isFetchingPreviousPage = createStore(false, {\n ...sidConfig(name, '$isFetchingPreviousPage'),\n }).on(isFetchingPreviousPageUpdated, (_, v) => v)\n const $isFetchNextPageError = createStore(false, {\n ...sidConfig(name, '$isFetchNextPageError'),\n }).on(isFetchNextPageErrorUpdated, (_, v) => v)\n const $isFetchPreviousPageError = createStore(false, {\n ...sidConfig(name, '$isFetchPreviousPageError'),\n }).on(isFetchPreviousPageErrorUpdated, (_, v) => v)\n\n const fetchNextPage = createEvent<void>()\n const fetchPreviousPage = createEvent<void>()\n\n return {\n stores: {\n $hasNextPage,\n $hasPreviousPage,\n $isFetchingNextPage,\n $isFetchingPreviousPage,\n $isFetchNextPageError,\n $isFetchPreviousPageError,\n fetchNextPage,\n fetchPreviousPage,\n },\n // Wire fetchNextPage / fetchPreviousPage as scope-aware effects via\n // attach over $observer — same pattern as the rest of createBaseQuery.\n setupEffects: ({ $observer }) => {\n const fetchNextPageFx = attach({\n source: $observer,\n effect: (observer) => {\n if (!observer) return\n observer.fetchNextPage()\n },\n })\n sample({ clock: fetchNextPage, target: fetchNextPageFx })\n\n const fetchPreviousPageFx = attach({\n source: $observer,\n effect: (observer) => {\n if (!observer) return\n observer.fetchPreviousPage()\n },\n })\n sample({ clock: fetchPreviousPage, target: fetchPreviousPageFx })\n },\n bindDispatcher: () => {\n const dispatchHasNextPage = scopeBind(hasNextPageUpdated, {\n safe: true,\n })\n const dispatchHasPreviousPage = scopeBind(hasPreviousPageUpdated, {\n safe: true,\n })\n const dispatchIsFetchingNextPage = scopeBind(\n isFetchingNextPageUpdated,\n { safe: true },\n )\n const dispatchIsFetchingPreviousPage = scopeBind(\n isFetchingPreviousPageUpdated,\n { safe: true },\n )\n const dispatchIsFetchNextPageError = scopeBind(\n isFetchNextPageErrorUpdated,\n { safe: true },\n )\n const dispatchIsFetchPreviousPageError = scopeBind(\n isFetchPreviousPageErrorUpdated,\n { safe: true },\n )\n\n return (result) => {\n dispatchHasNextPage(result.hasNextPage)\n dispatchHasPreviousPage(result.hasPreviousPage)\n dispatchIsFetchingNextPage(result.isFetchingNextPage)\n dispatchIsFetchingPreviousPage(result.isFetchingPreviousPage)\n dispatchIsFetchNextPageError(result.isFetchNextPageError)\n dispatchIsFetchPreviousPageError(result.isFetchPreviousPageError)\n }\n },\n }\n },\n },\n )\n\n // See createQuery.prefetch — same contract, but uses fetchInfiniteQuery so\n // the first page is fetched + cached on the server.\n const prefetch = createEvent<void>()\n const prefetchFx = attach({\n source: {\n qc: base.$queryClient,\n key: base.$resolvedKey,\n enabled: base.$enabled,\n },\n effect: ({ qc, key, enabled }) => {\n if (!qc || !enabled) return\n return qc.fetchInfiniteQuery({\n ...restOptions,\n queryKey: key,\n } as any)\n },\n })\n sample({ clock: prefetch, target: prefetchFx })\n\n const result: InfiniteQueryResult<TData, TError, TPageParam> = {\n $data: base.$data,\n $error: base.$error,\n $status: base.$status,\n $isPending: base.$isPending,\n $isFetching: base.$isFetching,\n $isSuccess: base.$isSuccess,\n $isError: base.$isError,\n $isPlaceholderData: base.$isPlaceholderData,\n $fetchStatus: base.$fetchStatus,\n $hasNextPage: base.$hasNextPage,\n $hasPreviousPage: base.$hasPreviousPage,\n $isFetchingNextPage: base.$isFetchingNextPage,\n $isFetchingPreviousPage: base.$isFetchingPreviousPage,\n $isFetchNextPageError: base.$isFetchNextPageError,\n $isFetchPreviousPageError: base.$isFetchPreviousPageError,\n $observer: base.$observer,\n $queryClient: base.$queryClient,\n fetchNextPage: base.fetchNextPage,\n fetchPreviousPage: base.fetchPreviousPage,\n refresh: base.refresh,\n prefetch,\n mounted: base.mounted,\n unmounted: base.unmounted,\n }\n\n Object.defineProperty(result, '__createObserver', {\n enumerable: false,\n value: (qc: QueryClient, init: { queryKey: any; enabled: boolean }) =>\n new InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n >(qc, {\n ...restOptions,\n queryKey: init.queryKey,\n enabled: init.enabled,\n } as any),\n })\n Object.defineProperty(result, '__resolvedKey', {\n enumerable: false,\n value: base.$resolvedKey,\n })\n Object.defineProperty(result, '__enabled', {\n enumerable: false,\n value: base.$enabled,\n })\n\n return result\n}\n\nfunction parseInfiniteArgs<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey extends EffectorQueryKey,\n>(\n arg1:\n | QueryClient\n | CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n arg2?: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n): [\n QueryClient | null,\n CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n] {\n if (arg2 !== undefined) {\n return [arg1 as QueryClient, arg2]\n }\n return [\n null,\n arg1 as CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n ]\n}\n"]}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { InfiniteData, QueryClient } from '@tanstack/query-core';
|
|
2
|
-
import { CreateInfiniteQueryOptions, InfiniteQueryResult } from './types.cjs';
|
|
2
|
+
import { EffectorQueryKey, CreateInfiniteQueryOptions, InfiniteQueryResult } from './types.cjs';
|
|
3
3
|
import 'effector';
|
|
4
4
|
|
|
5
|
-
declare function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam
|
|
6
|
-
declare function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam
|
|
5
|
+
declare function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam>, const TQueryKey extends EffectorQueryKey = EffectorQueryKey>(options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData, TQueryKey>): InfiniteQueryResult<TData, TError, TPageParam>;
|
|
6
|
+
declare function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam>, const TQueryKey extends EffectorQueryKey = EffectorQueryKey>(queryClient: QueryClient, options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData, TQueryKey>): InfiniteQueryResult<TData, TError, TPageParam>;
|
|
7
7
|
|
|
8
8
|
export { createInfiniteQuery };
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { InfiniteData, QueryClient } from '@tanstack/query-core';
|
|
2
|
-
import { CreateInfiniteQueryOptions, InfiniteQueryResult } from './types.js';
|
|
2
|
+
import { EffectorQueryKey, CreateInfiniteQueryOptions, InfiniteQueryResult } from './types.js';
|
|
3
3
|
import 'effector';
|
|
4
4
|
|
|
5
|
-
declare function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam
|
|
6
|
-
declare function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam
|
|
5
|
+
declare function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam>, const TQueryKey extends EffectorQueryKey = EffectorQueryKey>(options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData, TQueryKey>): InfiniteQueryResult<TData, TError, TPageParam>;
|
|
6
|
+
declare function createInfiniteQuery<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam>, const TQueryKey extends EffectorQueryKey = EffectorQueryKey>(queryClient: QueryClient, options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData, TQueryKey>): InfiniteQueryResult<TData, TError, TPageParam>;
|
|
7
7
|
|
|
8
8
|
export { createInfiniteQuery };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createInfiniteQuery.ts"],"names":["result","enabled"],"mappings":"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","file":"createInfiniteQuery.js","sourcesContent":["import { attach, createEvent, createStore, sample, scopeBind } from 'effector'\nimport { InfiniteQueryObserver } from '@tanstack/query-core'\nimport type {\n InfiniteData,\n QueryClient,\n QueryKey,\n} from '@tanstack/query-core'\nimport { createBaseQuery, sidConfig, warnMissingName } from './createBaseQuery'\nimport { resolveReactiveRefetchInterval } from './resolve'\nimport type {\n CreateInfiniteQueryOptions,\n InfiniteQueryResult,\n} from './types'\n\ntype Observer<TQueryFnData, TError, TData, TPageParam> = InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n>\n\ntype ObserverResult<TQueryFnData, TError, TData, TPageParam> = ReturnType<\n Observer<TQueryFnData, TError, TData, TPageParam>['getCurrentResult']\n>\n\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n>(\n options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n): InfiniteQueryResult<TData, TError, TPageParam>\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n>(\n queryClient: QueryClient,\n options: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n): InfiniteQueryResult<TData, TError, TPageParam>\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n>(\n arg1:\n | QueryClient\n | CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n arg2?: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n): InfiniteQueryResult<TData, TError, TPageParam> {\n const [explicitClient, options] = parseInfiniteArgs<\n TQueryFnData,\n TError,\n TPageParam,\n TData\n >(arg1, arg2)\n const { queryKey, enabled, name, ...restOptions } = options\n\n if (!name) warnMissingName('createInfiniteQuery')\n\n const reactiveRefetchInterval = resolveReactiveRefetchInterval(\n (restOptions as { refetchInterval?: unknown }).refetchInterval,\n )\n if (reactiveRefetchInterval) {\n delete (restOptions as { refetchInterval?: unknown }).refetchInterval\n }\n\n const base = createBaseQuery<\n TData,\n TError,\n ObserverResult<TQueryFnData, TError, TData, TPageParam>,\n Observer<TQueryFnData, TError, TData, TPageParam>,\n {\n $hasNextPage: ReturnType<typeof createStore<boolean>>\n $hasPreviousPage: ReturnType<typeof createStore<boolean>>\n $isFetchingNextPage: ReturnType<typeof createStore<boolean>>\n $isFetchingPreviousPage: ReturnType<typeof createStore<boolean>>\n $isFetchNextPageError: ReturnType<typeof createStore<boolean>>\n $isFetchPreviousPageError: ReturnType<typeof createStore<boolean>>\n fetchNextPage: ReturnType<typeof createEvent<void>>\n fetchPreviousPage: ReturnType<typeof createEvent<void>>\n }\n >(\n explicitClient,\n { queryKey, enabled, name, reactiveRefetchInterval },\n {\n createObserver: (qc, { queryKey: key, enabled: isEnabled }) =>\n new InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n >(qc, {\n ...restOptions,\n queryKey: key,\n enabled: isEnabled,\n } as any),\n setupExtras: () => {\n const hasNextPageUpdated = createEvent<boolean>()\n const hasPreviousPageUpdated = createEvent<boolean>()\n const isFetchingNextPageUpdated = createEvent<boolean>()\n const isFetchingPreviousPageUpdated = createEvent<boolean>()\n const isFetchNextPageErrorUpdated = createEvent<boolean>()\n const isFetchPreviousPageErrorUpdated = createEvent<boolean>()\n\n const $hasNextPage = createStore(false, {\n ...sidConfig(name, '$hasNextPage'),\n }).on(hasNextPageUpdated, (_, v) => v)\n const $hasPreviousPage = createStore(false, {\n ...sidConfig(name, '$hasPreviousPage'),\n }).on(hasPreviousPageUpdated, (_, v) => v)\n const $isFetchingNextPage = createStore(false, {\n ...sidConfig(name, '$isFetchingNextPage'),\n }).on(isFetchingNextPageUpdated, (_, v) => v)\n const $isFetchingPreviousPage = createStore(false, {\n ...sidConfig(name, '$isFetchingPreviousPage'),\n }).on(isFetchingPreviousPageUpdated, (_, v) => v)\n const $isFetchNextPageError = createStore(false, {\n ...sidConfig(name, '$isFetchNextPageError'),\n }).on(isFetchNextPageErrorUpdated, (_, v) => v)\n const $isFetchPreviousPageError = createStore(false, {\n ...sidConfig(name, '$isFetchPreviousPageError'),\n }).on(isFetchPreviousPageErrorUpdated, (_, v) => v)\n\n const fetchNextPage = createEvent<void>()\n const fetchPreviousPage = createEvent<void>()\n\n return {\n stores: {\n $hasNextPage,\n $hasPreviousPage,\n $isFetchingNextPage,\n $isFetchingPreviousPage,\n $isFetchNextPageError,\n $isFetchPreviousPageError,\n fetchNextPage,\n fetchPreviousPage,\n },\n // Wire fetchNextPage / fetchPreviousPage as scope-aware effects via\n // attach over $observer — same pattern as the rest of createBaseQuery.\n setupEffects: ({ $observer }) => {\n const fetchNextPageFx = attach({\n source: $observer,\n effect: (observer) => {\n if (!observer) return\n observer.fetchNextPage()\n },\n })\n sample({ clock: fetchNextPage, target: fetchNextPageFx })\n\n const fetchPreviousPageFx = attach({\n source: $observer,\n effect: (observer) => {\n if (!observer) return\n observer.fetchPreviousPage()\n },\n })\n sample({ clock: fetchPreviousPage, target: fetchPreviousPageFx })\n },\n bindDispatcher: () => {\n const dispatchHasNextPage = scopeBind(hasNextPageUpdated, {\n safe: true,\n })\n const dispatchHasPreviousPage = scopeBind(hasPreviousPageUpdated, {\n safe: true,\n })\n const dispatchIsFetchingNextPage = scopeBind(\n isFetchingNextPageUpdated,\n { safe: true },\n )\n const dispatchIsFetchingPreviousPage = scopeBind(\n isFetchingPreviousPageUpdated,\n { safe: true },\n )\n const dispatchIsFetchNextPageError = scopeBind(\n isFetchNextPageErrorUpdated,\n { safe: true },\n )\n const dispatchIsFetchPreviousPageError = scopeBind(\n isFetchPreviousPageErrorUpdated,\n { safe: true },\n )\n\n return (result) => {\n dispatchHasNextPage(result.hasNextPage)\n dispatchHasPreviousPage(result.hasPreviousPage)\n dispatchIsFetchingNextPage(result.isFetchingNextPage)\n dispatchIsFetchingPreviousPage(result.isFetchingPreviousPage)\n dispatchIsFetchNextPageError(result.isFetchNextPageError)\n dispatchIsFetchPreviousPageError(result.isFetchPreviousPageError)\n }\n },\n }\n },\n },\n )\n\n // See createQuery.prefetch — same contract, but uses fetchInfiniteQuery so\n // the first page is fetched + cached on the server.\n const prefetch = createEvent<void>()\n const prefetchFx = attach({\n source: {\n qc: base.$queryClient,\n key: base.$resolvedKey,\n enabled: base.$enabled,\n },\n effect: ({ qc, key, enabled }) => {\n if (!qc || !enabled) return\n return qc.fetchInfiniteQuery({\n ...restOptions,\n queryKey: key,\n } as any)\n },\n })\n sample({ clock: prefetch, target: prefetchFx })\n\n const result: InfiniteQueryResult<TData, TError, TPageParam> = {\n $data: base.$data,\n $error: base.$error,\n $status: base.$status,\n $isPending: base.$isPending,\n $isFetching: base.$isFetching,\n $isSuccess: base.$isSuccess,\n $isError: base.$isError,\n $isPlaceholderData: base.$isPlaceholderData,\n $fetchStatus: base.$fetchStatus,\n $hasNextPage: base.$hasNextPage,\n $hasPreviousPage: base.$hasPreviousPage,\n $isFetchingNextPage: base.$isFetchingNextPage,\n $isFetchingPreviousPage: base.$isFetchingPreviousPage,\n $isFetchNextPageError: base.$isFetchNextPageError,\n $isFetchPreviousPageError: base.$isFetchPreviousPageError,\n $observer: base.$observer,\n $queryClient: base.$queryClient,\n fetchNextPage: base.fetchNextPage,\n fetchPreviousPage: base.fetchPreviousPage,\n refresh: base.refresh,\n prefetch,\n mounted: base.mounted,\n unmounted: base.unmounted,\n }\n\n Object.defineProperty(result, '__createObserver', {\n enumerable: false,\n value: (qc: QueryClient, init: { queryKey: any; enabled: boolean }) =>\n new InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n >(qc, {\n ...restOptions,\n queryKey: init.queryKey,\n enabled: init.enabled,\n } as any),\n })\n Object.defineProperty(result, '__resolvedKey', {\n enumerable: false,\n value: base.$resolvedKey,\n })\n Object.defineProperty(result, '__enabled', {\n enumerable: false,\n value: base.$enabled,\n })\n\n return result\n}\n\nfunction parseInfiniteArgs<TQueryFnData, TError, TPageParam, TData>(\n arg1:\n | QueryClient\n | CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n arg2?: CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n): [\n QueryClient | null,\n CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n] {\n if (arg2 !== undefined) {\n return [arg1 as QueryClient, arg2]\n }\n return [\n null,\n arg1 as CreateInfiniteQueryOptions<TQueryFnData, TError, TPageParam, TData>,\n ]\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/createInfiniteQuery.ts"],"names":["result","enabled"],"mappings":"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","file":"createInfiniteQuery.js","sourcesContent":["import { attach, createEvent, createStore, sample, scopeBind } from 'effector'\nimport { InfiniteQueryObserver } from '@tanstack/query-core'\nimport type {\n InfiniteData,\n QueryClient,\n QueryKey,\n} from '@tanstack/query-core'\nimport { createBaseQuery, sidConfig, warnMissingName } from './createBaseQuery'\nimport { resolveReactiveRefetchInterval } from './resolve'\nimport type {\n CreateInfiniteQueryOptions,\n EffectorQueryKey,\n InfiniteQueryResult,\n} from './types'\n\ntype Observer<TQueryFnData, TError, TData, TPageParam> = InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n>\n\ntype ObserverResult<TQueryFnData, TError, TData, TPageParam> = ReturnType<\n Observer<TQueryFnData, TError, TData, TPageParam>['getCurrentResult']\n>\n\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n options: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n): InfiniteQueryResult<TData, TError, TPageParam>\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n queryClient: QueryClient,\n options: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n): InfiniteQueryResult<TData, TError, TPageParam>\nexport function createInfiniteQuery<\n TQueryFnData = unknown,\n TError = Error,\n TPageParam = unknown,\n TData = InfiniteData<TQueryFnData, TPageParam>,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n arg1:\n | QueryClient\n | CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n arg2?: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n): InfiniteQueryResult<TData, TError, TPageParam> {\n const [explicitClient, options] = parseInfiniteArgs<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >(arg1, arg2)\n const { queryKey, enabled, name, ...restOptions } = options\n\n if (!name) warnMissingName('createInfiniteQuery')\n\n const reactiveRefetchInterval = resolveReactiveRefetchInterval(\n (restOptions as { refetchInterval?: unknown }).refetchInterval,\n )\n if (reactiveRefetchInterval) {\n delete (restOptions as { refetchInterval?: unknown }).refetchInterval\n }\n\n const base = createBaseQuery<\n TData,\n TError,\n ObserverResult<TQueryFnData, TError, TData, TPageParam>,\n Observer<TQueryFnData, TError, TData, TPageParam>,\n {\n $hasNextPage: ReturnType<typeof createStore<boolean>>\n $hasPreviousPage: ReturnType<typeof createStore<boolean>>\n $isFetchingNextPage: ReturnType<typeof createStore<boolean>>\n $isFetchingPreviousPage: ReturnType<typeof createStore<boolean>>\n $isFetchNextPageError: ReturnType<typeof createStore<boolean>>\n $isFetchPreviousPageError: ReturnType<typeof createStore<boolean>>\n fetchNextPage: ReturnType<typeof createEvent<void>>\n fetchPreviousPage: ReturnType<typeof createEvent<void>>\n }\n >(\n explicitClient,\n { queryKey, enabled, name, reactiveRefetchInterval },\n {\n createObserver: (qc, { queryKey: key, enabled: isEnabled }) =>\n new InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n >(qc, {\n ...restOptions,\n queryKey: key,\n enabled: isEnabled,\n } as any),\n setupExtras: () => {\n const hasNextPageUpdated = createEvent<boolean>()\n const hasPreviousPageUpdated = createEvent<boolean>()\n const isFetchingNextPageUpdated = createEvent<boolean>()\n const isFetchingPreviousPageUpdated = createEvent<boolean>()\n const isFetchNextPageErrorUpdated = createEvent<boolean>()\n const isFetchPreviousPageErrorUpdated = createEvent<boolean>()\n\n const $hasNextPage = createStore(false, {\n ...sidConfig(name, '$hasNextPage'),\n }).on(hasNextPageUpdated, (_, v) => v)\n const $hasPreviousPage = createStore(false, {\n ...sidConfig(name, '$hasPreviousPage'),\n }).on(hasPreviousPageUpdated, (_, v) => v)\n const $isFetchingNextPage = createStore(false, {\n ...sidConfig(name, '$isFetchingNextPage'),\n }).on(isFetchingNextPageUpdated, (_, v) => v)\n const $isFetchingPreviousPage = createStore(false, {\n ...sidConfig(name, '$isFetchingPreviousPage'),\n }).on(isFetchingPreviousPageUpdated, (_, v) => v)\n const $isFetchNextPageError = createStore(false, {\n ...sidConfig(name, '$isFetchNextPageError'),\n }).on(isFetchNextPageErrorUpdated, (_, v) => v)\n const $isFetchPreviousPageError = createStore(false, {\n ...sidConfig(name, '$isFetchPreviousPageError'),\n }).on(isFetchPreviousPageErrorUpdated, (_, v) => v)\n\n const fetchNextPage = createEvent<void>()\n const fetchPreviousPage = createEvent<void>()\n\n return {\n stores: {\n $hasNextPage,\n $hasPreviousPage,\n $isFetchingNextPage,\n $isFetchingPreviousPage,\n $isFetchNextPageError,\n $isFetchPreviousPageError,\n fetchNextPage,\n fetchPreviousPage,\n },\n // Wire fetchNextPage / fetchPreviousPage as scope-aware effects via\n // attach over $observer — same pattern as the rest of createBaseQuery.\n setupEffects: ({ $observer }) => {\n const fetchNextPageFx = attach({\n source: $observer,\n effect: (observer) => {\n if (!observer) return\n observer.fetchNextPage()\n },\n })\n sample({ clock: fetchNextPage, target: fetchNextPageFx })\n\n const fetchPreviousPageFx = attach({\n source: $observer,\n effect: (observer) => {\n if (!observer) return\n observer.fetchPreviousPage()\n },\n })\n sample({ clock: fetchPreviousPage, target: fetchPreviousPageFx })\n },\n bindDispatcher: () => {\n const dispatchHasNextPage = scopeBind(hasNextPageUpdated, {\n safe: true,\n })\n const dispatchHasPreviousPage = scopeBind(hasPreviousPageUpdated, {\n safe: true,\n })\n const dispatchIsFetchingNextPage = scopeBind(\n isFetchingNextPageUpdated,\n { safe: true },\n )\n const dispatchIsFetchingPreviousPage = scopeBind(\n isFetchingPreviousPageUpdated,\n { safe: true },\n )\n const dispatchIsFetchNextPageError = scopeBind(\n isFetchNextPageErrorUpdated,\n { safe: true },\n )\n const dispatchIsFetchPreviousPageError = scopeBind(\n isFetchPreviousPageErrorUpdated,\n { safe: true },\n )\n\n return (result) => {\n dispatchHasNextPage(result.hasNextPage)\n dispatchHasPreviousPage(result.hasPreviousPage)\n dispatchIsFetchingNextPage(result.isFetchingNextPage)\n dispatchIsFetchingPreviousPage(result.isFetchingPreviousPage)\n dispatchIsFetchNextPageError(result.isFetchNextPageError)\n dispatchIsFetchPreviousPageError(result.isFetchPreviousPageError)\n }\n },\n }\n },\n },\n )\n\n // See createQuery.prefetch — same contract, but uses fetchInfiniteQuery so\n // the first page is fetched + cached on the server.\n const prefetch = createEvent<void>()\n const prefetchFx = attach({\n source: {\n qc: base.$queryClient,\n key: base.$resolvedKey,\n enabled: base.$enabled,\n },\n effect: ({ qc, key, enabled }) => {\n if (!qc || !enabled) return\n return qc.fetchInfiniteQuery({\n ...restOptions,\n queryKey: key,\n } as any)\n },\n })\n sample({ clock: prefetch, target: prefetchFx })\n\n const result: InfiniteQueryResult<TData, TError, TPageParam> = {\n $data: base.$data,\n $error: base.$error,\n $status: base.$status,\n $isPending: base.$isPending,\n $isFetching: base.$isFetching,\n $isSuccess: base.$isSuccess,\n $isError: base.$isError,\n $isPlaceholderData: base.$isPlaceholderData,\n $fetchStatus: base.$fetchStatus,\n $hasNextPage: base.$hasNextPage,\n $hasPreviousPage: base.$hasPreviousPage,\n $isFetchingNextPage: base.$isFetchingNextPage,\n $isFetchingPreviousPage: base.$isFetchingPreviousPage,\n $isFetchNextPageError: base.$isFetchNextPageError,\n $isFetchPreviousPageError: base.$isFetchPreviousPageError,\n $observer: base.$observer,\n $queryClient: base.$queryClient,\n fetchNextPage: base.fetchNextPage,\n fetchPreviousPage: base.fetchPreviousPage,\n refresh: base.refresh,\n prefetch,\n mounted: base.mounted,\n unmounted: base.unmounted,\n }\n\n Object.defineProperty(result, '__createObserver', {\n enumerable: false,\n value: (qc: QueryClient, init: { queryKey: any; enabled: boolean }) =>\n new InfiniteQueryObserver<\n TQueryFnData,\n TError,\n TData,\n QueryKey,\n TPageParam\n >(qc, {\n ...restOptions,\n queryKey: init.queryKey,\n enabled: init.enabled,\n } as any),\n })\n Object.defineProperty(result, '__resolvedKey', {\n enumerable: false,\n value: base.$resolvedKey,\n })\n Object.defineProperty(result, '__enabled', {\n enumerable: false,\n value: base.$enabled,\n })\n\n return result\n}\n\nfunction parseInfiniteArgs<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey extends EffectorQueryKey,\n>(\n arg1:\n | QueryClient\n | CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n arg2?: CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n): [\n QueryClient | null,\n CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n] {\n if (arg2 !== undefined) {\n return [arg1 as QueryClient, arg2]\n }\n return [\n null,\n arg1 as CreateInfiniteQueryOptions<\n TQueryFnData,\n TError,\n TPageParam,\n TData,\n TQueryKey\n >,\n ]\n}\n"]}
|
package/dist/createQuery.cjs
CHANGED
|
@@ -7,10 +7,7 @@ var resolve_cjs = require('./resolve.cjs');
|
|
|
7
7
|
|
|
8
8
|
// src/createQuery.ts
|
|
9
9
|
function createQuery(arg1, arg2) {
|
|
10
|
-
const [explicitClient, options] = parseQueryArgs(
|
|
11
|
-
arg1,
|
|
12
|
-
arg2
|
|
13
|
-
);
|
|
10
|
+
const [explicitClient, options] = parseQueryArgs(arg1, arg2);
|
|
14
11
|
const { queryKey, enabled, name, ...restOptions } = options;
|
|
15
12
|
if (!name) createBaseQuery_cjs.warnMissingName("createQuery");
|
|
16
13
|
const reactiveRefetchInterval = resolve_cjs.resolveReactiveRefetchInterval(
|
|
@@ -90,7 +87,10 @@ function parseQueryArgs(arg1, arg2) {
|
|
|
90
87
|
if (arg2 !== void 0) {
|
|
91
88
|
return [arg1, arg2];
|
|
92
89
|
}
|
|
93
|
-
return [
|
|
90
|
+
return [
|
|
91
|
+
null,
|
|
92
|
+
arg1
|
|
93
|
+
];
|
|
94
94
|
}
|
|
95
95
|
|
|
96
96
|
exports.createQuery = createQuery;
|
package/dist/createQuery.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createQuery.ts"],"names":["warnMissingName","resolveReactiveRefetchInterval","createBaseQuery","QueryObserver","createEvent","attach","enabled","sample"],"mappings":";;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/createQuery.ts"],"names":["warnMissingName","resolveReactiveRefetchInterval","createBaseQuery","QueryObserver","createEvent","attach","enabled","sample"],"mappings":"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","file":"createQuery.cjs","sourcesContent":["import { attach, createEvent, sample } from 'effector'\nimport { QueryObserver } from '@tanstack/query-core'\nimport type { QueryClient } from '@tanstack/query-core'\nimport { createBaseQuery, warnMissingName } from './createBaseQuery'\nimport { resolveReactiveRefetchInterval } from './resolve'\nimport type {\n CreateQueryOptions,\n EffectorQueryKey,\n QueryResult,\n} from './types'\n\nexport function createQuery<\n TQueryFnData = unknown,\n TError = Error,\n TData = TQueryFnData,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryResult<TData, TError>\nexport function createQuery<\n TQueryFnData = unknown,\n TError = Error,\n TData = TQueryFnData,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n queryClient: QueryClient,\n options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryResult<TData, TError>\nexport function createQuery<\n TQueryFnData = unknown,\n TError = Error,\n TData = TQueryFnData,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n arg1:\n | QueryClient\n | CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n arg2?: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryResult<TData, TError> {\n const [explicitClient, options] = parseQueryArgs<\n TQueryFnData,\n TError,\n TData,\n TQueryKey\n >(arg1, arg2)\n const { queryKey, enabled, name, ...restOptions } = options\n\n if (!name) warnMissingName('createQuery')\n\n // If `refetchInterval` is a Store, pull it out for reactive wiring in\n // createBaseQuery — otherwise leave it in restOptions for the observer\n // constructor (handles plain values and function forms unchanged).\n const reactiveRefetchInterval = resolveReactiveRefetchInterval(\n (restOptions as { refetchInterval?: unknown }).refetchInterval,\n )\n if (reactiveRefetchInterval) {\n delete (restOptions as { refetchInterval?: unknown }).refetchInterval\n }\n\n const base = createBaseQuery<\n TData,\n TError,\n ReturnType<QueryObserver<TQueryFnData, TError, TData>['getCurrentResult']>,\n QueryObserver<TQueryFnData, TError, TData>\n >(\n explicitClient,\n { queryKey, enabled, name, reactiveRefetchInterval },\n {\n createObserver: (qc, { queryKey: key, enabled: isEnabled }) =>\n // Cast: restOptions's `refetchInterval` may still type as\n // `Store | number | false | fn`; the Store form is deleted at runtime\n // above, but TS can't narrow that here.\n new QueryObserver<TQueryFnData, TError, TData>(qc, {\n ...restOptions,\n queryKey: key,\n enabled: isEnabled,\n } as any),\n },\n )\n\n // Prefetch event: drives `queryClient.fetchQuery` directly (no Observer)\n // and **awaits** the result, so `allSettled(query.prefetch, { scope })` on\n // the server returns only after the cache has the data. Unlike `mounted`,\n // which kicks off a background subscription and resolves immediately, this\n // is the right primitive for SSR / route loaders. The current resolved key\n // + enabled is read from the scope via attach — reactive keys work.\n const prefetch = createEvent<void>()\n const prefetchFx = attach({\n source: {\n qc: base.$queryClient,\n key: base.$resolvedKey,\n enabled: base.$enabled,\n },\n effect: ({ qc, key, enabled }) => {\n if (!qc || !enabled) return\n return qc.fetchQuery({\n ...restOptions,\n queryKey: key,\n } as any)\n },\n })\n sample({ clock: prefetch, target: prefetchFx })\n\n // Lazy `observer` field for backward compatibility — returns the\n // default-scope observer (non-fork). Tests and advanced consumers that read\n // `query.observer` after `query.mounted()` see the live observer. For\n // fork-aware consumers, use `query.$observer` via `useUnit`.\n const result: QueryResult<TData, TError> = {\n $data: base.$data,\n $error: base.$error,\n $status: base.$status,\n $isPending: base.$isPending,\n $isFetching: base.$isFetching,\n $isSuccess: base.$isSuccess,\n $isError: base.$isError,\n $isPlaceholderData: base.$isPlaceholderData,\n $fetchStatus: base.$fetchStatus,\n $observer: base.$observer as unknown as QueryResult<\n TData,\n TError\n >['$observer'],\n $queryClient: base.$queryClient,\n refresh: base.refresh,\n prefetch,\n mounted: base.mounted,\n unmounted: base.unmounted,\n }\n\n // Internal: used by useSuspenseQuery to construct a transient observer\n // when the suspense hook renders before mountFx has populated the scope's\n // $observer (mountFx runs from useEffect, which is skipped while\n // suspended). Not part of the public API; not in TS types.\n Object.defineProperty(result, '__createObserver', {\n enumerable: false,\n value: (qc: QueryClient, init: { queryKey: any; enabled: boolean }) =>\n new QueryObserver<TQueryFnData, TError, TData>(qc, {\n ...restOptions,\n queryKey: init.queryKey,\n enabled: init.enabled,\n } as any),\n })\n Object.defineProperty(result, '__resolvedKey', {\n enumerable: false,\n value: base.$resolvedKey,\n })\n Object.defineProperty(result, '__enabled', {\n enumerable: false,\n value: base.$enabled,\n })\n\n return result\n}\n\nfunction parseQueryArgs<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends EffectorQueryKey,\n>(\n arg1:\n | QueryClient\n | CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n arg2?: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): [\n QueryClient | null,\n CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n] {\n if (arg2 !== undefined) {\n return [arg1 as QueryClient, arg2]\n }\n return [\n null,\n arg1 as CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n ]\n}\n"]}
|
package/dist/createQuery.d.cts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { QueryClient } from '@tanstack/query-core';
|
|
2
|
-
import { CreateQueryOptions, QueryResult } from './types.cjs';
|
|
2
|
+
import { EffectorQueryKey, CreateQueryOptions, QueryResult } from './types.cjs';
|
|
3
3
|
import 'effector';
|
|
4
4
|
|
|
5
|
-
declare function createQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData>(options: CreateQueryOptions<TQueryFnData, TError, TData>): QueryResult<TData, TError>;
|
|
6
|
-
declare function createQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData>(queryClient: QueryClient, options: CreateQueryOptions<TQueryFnData, TError, TData>): QueryResult<TData, TError>;
|
|
5
|
+
declare function createQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, const TQueryKey extends EffectorQueryKey = EffectorQueryKey>(options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>): QueryResult<TData, TError>;
|
|
6
|
+
declare function createQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, const TQueryKey extends EffectorQueryKey = EffectorQueryKey>(queryClient: QueryClient, options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>): QueryResult<TData, TError>;
|
|
7
7
|
|
|
8
8
|
export { createQuery };
|
package/dist/createQuery.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { QueryClient } from '@tanstack/query-core';
|
|
2
|
-
import { CreateQueryOptions, QueryResult } from './types.js';
|
|
2
|
+
import { EffectorQueryKey, CreateQueryOptions, QueryResult } from './types.js';
|
|
3
3
|
import 'effector';
|
|
4
4
|
|
|
5
|
-
declare function createQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData>(options: CreateQueryOptions<TQueryFnData, TError, TData>): QueryResult<TData, TError>;
|
|
6
|
-
declare function createQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData>(queryClient: QueryClient, options: CreateQueryOptions<TQueryFnData, TError, TData>): QueryResult<TData, TError>;
|
|
5
|
+
declare function createQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, const TQueryKey extends EffectorQueryKey = EffectorQueryKey>(options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>): QueryResult<TData, TError>;
|
|
6
|
+
declare function createQuery<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, const TQueryKey extends EffectorQueryKey = EffectorQueryKey>(queryClient: QueryClient, options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>): QueryResult<TData, TError>;
|
|
7
7
|
|
|
8
8
|
export { createQuery };
|
package/dist/createQuery.js
CHANGED
|
@@ -5,10 +5,7 @@ import { resolveReactiveRefetchInterval } from './resolve.js';
|
|
|
5
5
|
|
|
6
6
|
// src/createQuery.ts
|
|
7
7
|
function createQuery(arg1, arg2) {
|
|
8
|
-
const [explicitClient, options] = parseQueryArgs(
|
|
9
|
-
arg1,
|
|
10
|
-
arg2
|
|
11
|
-
);
|
|
8
|
+
const [explicitClient, options] = parseQueryArgs(arg1, arg2);
|
|
12
9
|
const { queryKey, enabled, name, ...restOptions } = options;
|
|
13
10
|
if (!name) warnMissingName("createQuery");
|
|
14
11
|
const reactiveRefetchInterval = resolveReactiveRefetchInterval(
|
|
@@ -88,7 +85,10 @@ function parseQueryArgs(arg1, arg2) {
|
|
|
88
85
|
if (arg2 !== void 0) {
|
|
89
86
|
return [arg1, arg2];
|
|
90
87
|
}
|
|
91
|
-
return [
|
|
88
|
+
return [
|
|
89
|
+
null,
|
|
90
|
+
arg1
|
|
91
|
+
];
|
|
92
92
|
}
|
|
93
93
|
|
|
94
94
|
export { createQuery };
|
package/dist/createQuery.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/createQuery.ts"],"names":["enabled"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"sources":["../src/createQuery.ts"],"names":["enabled"],"mappings":"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","file":"createQuery.js","sourcesContent":["import { attach, createEvent, sample } from 'effector'\nimport { QueryObserver } from '@tanstack/query-core'\nimport type { QueryClient } from '@tanstack/query-core'\nimport { createBaseQuery, warnMissingName } from './createBaseQuery'\nimport { resolveReactiveRefetchInterval } from './resolve'\nimport type {\n CreateQueryOptions,\n EffectorQueryKey,\n QueryResult,\n} from './types'\n\nexport function createQuery<\n TQueryFnData = unknown,\n TError = Error,\n TData = TQueryFnData,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryResult<TData, TError>\nexport function createQuery<\n TQueryFnData = unknown,\n TError = Error,\n TData = TQueryFnData,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n queryClient: QueryClient,\n options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryResult<TData, TError>\nexport function createQuery<\n TQueryFnData = unknown,\n TError = Error,\n TData = TQueryFnData,\n const TQueryKey extends EffectorQueryKey = EffectorQueryKey,\n>(\n arg1:\n | QueryClient\n | CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n arg2?: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): QueryResult<TData, TError> {\n const [explicitClient, options] = parseQueryArgs<\n TQueryFnData,\n TError,\n TData,\n TQueryKey\n >(arg1, arg2)\n const { queryKey, enabled, name, ...restOptions } = options\n\n if (!name) warnMissingName('createQuery')\n\n // If `refetchInterval` is a Store, pull it out for reactive wiring in\n // createBaseQuery — otherwise leave it in restOptions for the observer\n // constructor (handles plain values and function forms unchanged).\n const reactiveRefetchInterval = resolveReactiveRefetchInterval(\n (restOptions as { refetchInterval?: unknown }).refetchInterval,\n )\n if (reactiveRefetchInterval) {\n delete (restOptions as { refetchInterval?: unknown }).refetchInterval\n }\n\n const base = createBaseQuery<\n TData,\n TError,\n ReturnType<QueryObserver<TQueryFnData, TError, TData>['getCurrentResult']>,\n QueryObserver<TQueryFnData, TError, TData>\n >(\n explicitClient,\n { queryKey, enabled, name, reactiveRefetchInterval },\n {\n createObserver: (qc, { queryKey: key, enabled: isEnabled }) =>\n // Cast: restOptions's `refetchInterval` may still type as\n // `Store | number | false | fn`; the Store form is deleted at runtime\n // above, but TS can't narrow that here.\n new QueryObserver<TQueryFnData, TError, TData>(qc, {\n ...restOptions,\n queryKey: key,\n enabled: isEnabled,\n } as any),\n },\n )\n\n // Prefetch event: drives `queryClient.fetchQuery` directly (no Observer)\n // and **awaits** the result, so `allSettled(query.prefetch, { scope })` on\n // the server returns only after the cache has the data. Unlike `mounted`,\n // which kicks off a background subscription and resolves immediately, this\n // is the right primitive for SSR / route loaders. The current resolved key\n // + enabled is read from the scope via attach — reactive keys work.\n const prefetch = createEvent<void>()\n const prefetchFx = attach({\n source: {\n qc: base.$queryClient,\n key: base.$resolvedKey,\n enabled: base.$enabled,\n },\n effect: ({ qc, key, enabled }) => {\n if (!qc || !enabled) return\n return qc.fetchQuery({\n ...restOptions,\n queryKey: key,\n } as any)\n },\n })\n sample({ clock: prefetch, target: prefetchFx })\n\n // Lazy `observer` field for backward compatibility — returns the\n // default-scope observer (non-fork). Tests and advanced consumers that read\n // `query.observer` after `query.mounted()` see the live observer. For\n // fork-aware consumers, use `query.$observer` via `useUnit`.\n const result: QueryResult<TData, TError> = {\n $data: base.$data,\n $error: base.$error,\n $status: base.$status,\n $isPending: base.$isPending,\n $isFetching: base.$isFetching,\n $isSuccess: base.$isSuccess,\n $isError: base.$isError,\n $isPlaceholderData: base.$isPlaceholderData,\n $fetchStatus: base.$fetchStatus,\n $observer: base.$observer as unknown as QueryResult<\n TData,\n TError\n >['$observer'],\n $queryClient: base.$queryClient,\n refresh: base.refresh,\n prefetch,\n mounted: base.mounted,\n unmounted: base.unmounted,\n }\n\n // Internal: used by useSuspenseQuery to construct a transient observer\n // when the suspense hook renders before mountFx has populated the scope's\n // $observer (mountFx runs from useEffect, which is skipped while\n // suspended). Not part of the public API; not in TS types.\n Object.defineProperty(result, '__createObserver', {\n enumerable: false,\n value: (qc: QueryClient, init: { queryKey: any; enabled: boolean }) =>\n new QueryObserver<TQueryFnData, TError, TData>(qc, {\n ...restOptions,\n queryKey: init.queryKey,\n enabled: init.enabled,\n } as any),\n })\n Object.defineProperty(result, '__resolvedKey', {\n enumerable: false,\n value: base.$resolvedKey,\n })\n Object.defineProperty(result, '__enabled', {\n enumerable: false,\n value: base.$enabled,\n })\n\n return result\n}\n\nfunction parseQueryArgs<\n TQueryFnData,\n TError,\n TData,\n TQueryKey extends EffectorQueryKey,\n>(\n arg1:\n | QueryClient\n | CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n arg2?: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n): [\n QueryClient | null,\n CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n] {\n if (arg2 !== undefined) {\n return [arg1 as QueryClient, arg2]\n }\n return [\n null,\n arg1 as CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,\n ]\n}\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -5,6 +5,7 @@ var createInfiniteQuery_cjs = require('./createInfiniteQuery.cjs');
|
|
|
5
5
|
var createMutation_cjs = require('./createMutation.cjs');
|
|
6
6
|
var createInvalidate_cjs = require('./createInvalidate.cjs');
|
|
7
7
|
var queryClient_cjs = require('./queryClient.cjs');
|
|
8
|
+
var prefetchQueries_cjs = require('./prefetchQueries.cjs');
|
|
8
9
|
|
|
9
10
|
|
|
10
11
|
|
|
@@ -32,5 +33,9 @@ Object.defineProperty(exports, "setQueryClient", {
|
|
|
32
33
|
enumerable: true,
|
|
33
34
|
get: function () { return queryClient_cjs.setQueryClient; }
|
|
34
35
|
});
|
|
36
|
+
Object.defineProperty(exports, "prefetchQueries", {
|
|
37
|
+
enumerable: true,
|
|
38
|
+
get: function () { return prefetchQueries_cjs.prefetchQueries; }
|
|
39
|
+
});
|
|
35
40
|
//# sourceMappingURL=index.cjs.map
|
|
36
41
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.d.cts
CHANGED
|
@@ -3,6 +3,7 @@ export { createInfiniteQuery } from './createInfiniteQuery.cjs';
|
|
|
3
3
|
export { createMutation } from './createMutation.cjs';
|
|
4
4
|
export { CreateInvalidateOptions, createInvalidate } from './createInvalidate.cjs';
|
|
5
5
|
export { $queryClient, setQueryClient } from './queryClient.cjs';
|
|
6
|
+
export { PrefetchQueriesConfig, PrefetchableQuery, prefetchQueries } from './prefetchQueries.cjs';
|
|
6
7
|
export { CreateInfiniteQueryOptions, CreateMutationOptions, CreateQueryOptions, EffectorQueryKey, InfiniteQueryResult, MutationResult, MutationStatus, QueryResult, StoreOrValue } from './types.cjs';
|
|
7
8
|
import '@tanstack/query-core';
|
|
8
9
|
import 'effector';
|
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ export { createInfiniteQuery } from './createInfiniteQuery.js';
|
|
|
3
3
|
export { createMutation } from './createMutation.js';
|
|
4
4
|
export { CreateInvalidateOptions, createInvalidate } from './createInvalidate.js';
|
|
5
5
|
export { $queryClient, setQueryClient } from './queryClient.js';
|
|
6
|
+
export { PrefetchQueriesConfig, PrefetchableQuery, prefetchQueries } from './prefetchQueries.js';
|
|
6
7
|
export { CreateInfiniteQueryOptions, CreateMutationOptions, CreateQueryOptions, EffectorQueryKey, InfiniteQueryResult, MutationResult, MutationStatus, QueryResult, StoreOrValue } from './types.js';
|
|
7
8
|
import '@tanstack/query-core';
|
|
8
9
|
import 'effector';
|
package/dist/index.js
CHANGED
|
@@ -3,5 +3,6 @@ export { createInfiniteQuery } from './createInfiniteQuery.js';
|
|
|
3
3
|
export { createMutation } from './createMutation.js';
|
|
4
4
|
export { createInvalidate } from './createInvalidate.js';
|
|
5
5
|
export { $queryClient, setQueryClient } from './queryClient.js';
|
|
6
|
+
export { prefetchQueries } from './prefetchQueries.js';
|
|
6
7
|
//# sourceMappingURL=index.js.map
|
|
7
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var effector = require('effector');
|
|
4
|
+
|
|
5
|
+
// src/prefetchQueries.ts
|
|
6
|
+
async function prefetchQueries(queries, config) {
|
|
7
|
+
const { scope } = config;
|
|
8
|
+
await Promise.all(queries.map((q) => effector.allSettled(q.prefetch, { scope })));
|
|
9
|
+
await Promise.all(queries.map((q) => effector.allSettled(q.mounted, { scope })));
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
exports.prefetchQueries = prefetchQueries;
|
|
13
|
+
//# sourceMappingURL=prefetchQueries.cjs.map
|
|
14
|
+
//# sourceMappingURL=prefetchQueries.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/prefetchQueries.ts"],"names":["allSettled"],"mappings":";;;;;AA2DA,eAAsB,eAAA,CACpB,SACA,MAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAMA,mBAAA,CAAW,CAAA,CAAE,QAAA,EAAU,EAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAMA,mBAAA,CAAW,CAAA,CAAE,OAAA,EAAS,EAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AACxE","file":"prefetchQueries.cjs","sourcesContent":["import { allSettled } from 'effector'\nimport type { EventCallable, Scope } from 'effector'\n\n/**\n * Structural shape of any factory result that exposes the two SSR\n * lifecycle events. Both `QueryResult` and `InfiniteQueryResult` satisfy\n * this without forcing the caller to widen their `TData` / `TError` type\n * parameters.\n */\nexport interface PrefetchableQuery {\n prefetch: EventCallable<void>\n mounted: EventCallable<void>\n}\n\nexport interface PrefetchQueriesConfig {\n /** Scope to run the lifecycle events in. Required — `allSettled` cannot\n * await unit triggers outside of a scope. */\n scope: Scope\n}\n\n/**\n * Server-side helper that fills **both** SSR layers for a set of queries:\n *\n * 1. `await allSettled(q.prefetch, { scope })` for each query — awaits\n * `queryClient.fetchQuery(...)` so by the time the promise resolves\n * the cache holds the data.\n * 2. `await allSettled(q.mounted, { scope })` for each query — creates\n * the per-scope observer; its synchronous `getCurrentResult()`\n * dispatch reads from the now-populated cache and writes into the\n * effector stores (`$data`, `$status`, …). This is what makes\n * `serialize(scope)` ship populated stores, which in turn lets the\n * server-rendered HTML show data on first paint.\n *\n * Skipping step 2 (calling only `prefetch`) leaves the effector stores at\n * their defaults — `serialize(scope)` returns nothing useful, the\n * server-rendered HTML shows loading, and the user sees a flash on\n * hydration. This helper exists so that bug is impossible to write.\n *\n * Both phases run in parallel within themselves (`Promise.all`) but\n * sequentially across phases (`mounted` must see a populated cache).\n *\n * Snapshot the layers yourself afterwards — `dehydrate(queryClient)` for\n * the cache and `serialize(scope)` for the stores — and ship both to the\n * client (e.g. via `<HydrationBoundary state={...}>` + `<EffectorNext\n * values={...}>` or `fork({ values: ... })`).\n *\n * @example\n * ```ts\n * const queryClient = new QueryClient()\n * const scope = fork({ values: [[$queryClient, queryClient]] })\n *\n * await prefetchQueries([listQuery, pokemonQuery], { scope })\n *\n * return {\n * dehydratedQueryClient: dehydrate(queryClient),\n * serializedScope: serialize(scope),\n * }\n * ```\n */\nexport async function prefetchQueries(\n queries: ReadonlyArray<PrefetchableQuery>,\n config: PrefetchQueriesConfig,\n): Promise<void> {\n const { scope } = config\n await Promise.all(queries.map((q) => allSettled(q.prefetch, { scope })))\n await Promise.all(queries.map((q) => allSettled(q.mounted, { scope })))\n}\n"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Scope, EventCallable } from 'effector';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Structural shape of any factory result that exposes the two SSR
|
|
5
|
+
* lifecycle events. Both `QueryResult` and `InfiniteQueryResult` satisfy
|
|
6
|
+
* this without forcing the caller to widen their `TData` / `TError` type
|
|
7
|
+
* parameters.
|
|
8
|
+
*/
|
|
9
|
+
interface PrefetchableQuery {
|
|
10
|
+
prefetch: EventCallable<void>;
|
|
11
|
+
mounted: EventCallable<void>;
|
|
12
|
+
}
|
|
13
|
+
interface PrefetchQueriesConfig {
|
|
14
|
+
/** Scope to run the lifecycle events in. Required — `allSettled` cannot
|
|
15
|
+
* await unit triggers outside of a scope. */
|
|
16
|
+
scope: Scope;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Server-side helper that fills **both** SSR layers for a set of queries:
|
|
20
|
+
*
|
|
21
|
+
* 1. `await allSettled(q.prefetch, { scope })` for each query — awaits
|
|
22
|
+
* `queryClient.fetchQuery(...)` so by the time the promise resolves
|
|
23
|
+
* the cache holds the data.
|
|
24
|
+
* 2. `await allSettled(q.mounted, { scope })` for each query — creates
|
|
25
|
+
* the per-scope observer; its synchronous `getCurrentResult()`
|
|
26
|
+
* dispatch reads from the now-populated cache and writes into the
|
|
27
|
+
* effector stores (`$data`, `$status`, …). This is what makes
|
|
28
|
+
* `serialize(scope)` ship populated stores, which in turn lets the
|
|
29
|
+
* server-rendered HTML show data on first paint.
|
|
30
|
+
*
|
|
31
|
+
* Skipping step 2 (calling only `prefetch`) leaves the effector stores at
|
|
32
|
+
* their defaults — `serialize(scope)` returns nothing useful, the
|
|
33
|
+
* server-rendered HTML shows loading, and the user sees a flash on
|
|
34
|
+
* hydration. This helper exists so that bug is impossible to write.
|
|
35
|
+
*
|
|
36
|
+
* Both phases run in parallel within themselves (`Promise.all`) but
|
|
37
|
+
* sequentially across phases (`mounted` must see a populated cache).
|
|
38
|
+
*
|
|
39
|
+
* Snapshot the layers yourself afterwards — `dehydrate(queryClient)` for
|
|
40
|
+
* the cache and `serialize(scope)` for the stores — and ship both to the
|
|
41
|
+
* client (e.g. via `<HydrationBoundary state={...}>` + `<EffectorNext
|
|
42
|
+
* values={...}>` or `fork({ values: ... })`).
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* const queryClient = new QueryClient()
|
|
47
|
+
* const scope = fork({ values: [[$queryClient, queryClient]] })
|
|
48
|
+
*
|
|
49
|
+
* await prefetchQueries([listQuery, pokemonQuery], { scope })
|
|
50
|
+
*
|
|
51
|
+
* return {
|
|
52
|
+
* dehydratedQueryClient: dehydrate(queryClient),
|
|
53
|
+
* serializedScope: serialize(scope),
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
declare function prefetchQueries(queries: ReadonlyArray<PrefetchableQuery>, config: PrefetchQueriesConfig): Promise<void>;
|
|
58
|
+
|
|
59
|
+
export { type PrefetchQueriesConfig, type PrefetchableQuery, prefetchQueries };
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { Scope, EventCallable } from 'effector';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Structural shape of any factory result that exposes the two SSR
|
|
5
|
+
* lifecycle events. Both `QueryResult` and `InfiniteQueryResult` satisfy
|
|
6
|
+
* this without forcing the caller to widen their `TData` / `TError` type
|
|
7
|
+
* parameters.
|
|
8
|
+
*/
|
|
9
|
+
interface PrefetchableQuery {
|
|
10
|
+
prefetch: EventCallable<void>;
|
|
11
|
+
mounted: EventCallable<void>;
|
|
12
|
+
}
|
|
13
|
+
interface PrefetchQueriesConfig {
|
|
14
|
+
/** Scope to run the lifecycle events in. Required — `allSettled` cannot
|
|
15
|
+
* await unit triggers outside of a scope. */
|
|
16
|
+
scope: Scope;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Server-side helper that fills **both** SSR layers for a set of queries:
|
|
20
|
+
*
|
|
21
|
+
* 1. `await allSettled(q.prefetch, { scope })` for each query — awaits
|
|
22
|
+
* `queryClient.fetchQuery(...)` so by the time the promise resolves
|
|
23
|
+
* the cache holds the data.
|
|
24
|
+
* 2. `await allSettled(q.mounted, { scope })` for each query — creates
|
|
25
|
+
* the per-scope observer; its synchronous `getCurrentResult()`
|
|
26
|
+
* dispatch reads from the now-populated cache and writes into the
|
|
27
|
+
* effector stores (`$data`, `$status`, …). This is what makes
|
|
28
|
+
* `serialize(scope)` ship populated stores, which in turn lets the
|
|
29
|
+
* server-rendered HTML show data on first paint.
|
|
30
|
+
*
|
|
31
|
+
* Skipping step 2 (calling only `prefetch`) leaves the effector stores at
|
|
32
|
+
* their defaults — `serialize(scope)` returns nothing useful, the
|
|
33
|
+
* server-rendered HTML shows loading, and the user sees a flash on
|
|
34
|
+
* hydration. This helper exists so that bug is impossible to write.
|
|
35
|
+
*
|
|
36
|
+
* Both phases run in parallel within themselves (`Promise.all`) but
|
|
37
|
+
* sequentially across phases (`mounted` must see a populated cache).
|
|
38
|
+
*
|
|
39
|
+
* Snapshot the layers yourself afterwards — `dehydrate(queryClient)` for
|
|
40
|
+
* the cache and `serialize(scope)` for the stores — and ship both to the
|
|
41
|
+
* client (e.g. via `<HydrationBoundary state={...}>` + `<EffectorNext
|
|
42
|
+
* values={...}>` or `fork({ values: ... })`).
|
|
43
|
+
*
|
|
44
|
+
* @example
|
|
45
|
+
* ```ts
|
|
46
|
+
* const queryClient = new QueryClient()
|
|
47
|
+
* const scope = fork({ values: [[$queryClient, queryClient]] })
|
|
48
|
+
*
|
|
49
|
+
* await prefetchQueries([listQuery, pokemonQuery], { scope })
|
|
50
|
+
*
|
|
51
|
+
* return {
|
|
52
|
+
* dehydratedQueryClient: dehydrate(queryClient),
|
|
53
|
+
* serializedScope: serialize(scope),
|
|
54
|
+
* }
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
declare function prefetchQueries(queries: ReadonlyArray<PrefetchableQuery>, config: PrefetchQueriesConfig): Promise<void>;
|
|
58
|
+
|
|
59
|
+
export { type PrefetchQueriesConfig, type PrefetchableQuery, prefetchQueries };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { allSettled } from 'effector';
|
|
2
|
+
|
|
3
|
+
// src/prefetchQueries.ts
|
|
4
|
+
async function prefetchQueries(queries, config) {
|
|
5
|
+
const { scope } = config;
|
|
6
|
+
await Promise.all(queries.map((q) => allSettled(q.prefetch, { scope })));
|
|
7
|
+
await Promise.all(queries.map((q) => allSettled(q.mounted, { scope })));
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export { prefetchQueries };
|
|
11
|
+
//# sourceMappingURL=prefetchQueries.js.map
|
|
12
|
+
//# sourceMappingURL=prefetchQueries.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/prefetchQueries.ts"],"names":[],"mappings":";;;AA2DA,eAAsB,eAAA,CACpB,SACA,MAAA,EACe;AACf,EAAA,MAAM,EAAE,OAAM,GAAI,MAAA;AAClB,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,QAAA,EAAU,EAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AACvE,EAAA,MAAM,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,UAAA,CAAW,CAAA,CAAE,OAAA,EAAS,EAAE,KAAA,EAAO,CAAC,CAAC,CAAA;AACxE","file":"prefetchQueries.js","sourcesContent":["import { allSettled } from 'effector'\nimport type { EventCallable, Scope } from 'effector'\n\n/**\n * Structural shape of any factory result that exposes the two SSR\n * lifecycle events. Both `QueryResult` and `InfiniteQueryResult` satisfy\n * this without forcing the caller to widen their `TData` / `TError` type\n * parameters.\n */\nexport interface PrefetchableQuery {\n prefetch: EventCallable<void>\n mounted: EventCallable<void>\n}\n\nexport interface PrefetchQueriesConfig {\n /** Scope to run the lifecycle events in. Required — `allSettled` cannot\n * await unit triggers outside of a scope. */\n scope: Scope\n}\n\n/**\n * Server-side helper that fills **both** SSR layers for a set of queries:\n *\n * 1. `await allSettled(q.prefetch, { scope })` for each query — awaits\n * `queryClient.fetchQuery(...)` so by the time the promise resolves\n * the cache holds the data.\n * 2. `await allSettled(q.mounted, { scope })` for each query — creates\n * the per-scope observer; its synchronous `getCurrentResult()`\n * dispatch reads from the now-populated cache and writes into the\n * effector stores (`$data`, `$status`, …). This is what makes\n * `serialize(scope)` ship populated stores, which in turn lets the\n * server-rendered HTML show data on first paint.\n *\n * Skipping step 2 (calling only `prefetch`) leaves the effector stores at\n * their defaults — `serialize(scope)` returns nothing useful, the\n * server-rendered HTML shows loading, and the user sees a flash on\n * hydration. This helper exists so that bug is impossible to write.\n *\n * Both phases run in parallel within themselves (`Promise.all`) but\n * sequentially across phases (`mounted` must see a populated cache).\n *\n * Snapshot the layers yourself afterwards — `dehydrate(queryClient)` for\n * the cache and `serialize(scope)` for the stores — and ship both to the\n * client (e.g. via `<HydrationBoundary state={...}>` + `<EffectorNext\n * values={...}>` or `fork({ values: ... })`).\n *\n * @example\n * ```ts\n * const queryClient = new QueryClient()\n * const scope = fork({ values: [[$queryClient, queryClient]] })\n *\n * await prefetchQueries([listQuery, pokemonQuery], { scope })\n *\n * return {\n * dehydratedQueryClient: dehydrate(queryClient),\n * serializedScope: serialize(scope),\n * }\n * ```\n */\nexport async function prefetchQueries(\n queries: ReadonlyArray<PrefetchableQuery>,\n config: PrefetchQueriesConfig,\n): Promise<void> {\n const { scope } = config\n await Promise.all(queries.map((q) => allSettled(q.prefetch, { scope })))\n await Promise.all(queries.map((q) => allSettled(q.mounted, { scope })))\n}\n"]}
|
package/dist/types.d.cts
CHANGED
|
@@ -11,8 +11,32 @@ type StoreOrValue<T> = Store<T> | T;
|
|
|
11
11
|
* queryKey: ['user', $userId, 'details']
|
|
12
12
|
*/
|
|
13
13
|
type EffectorQueryKey = ReadonlyArray<StoreOrValue<string | number | bigint | boolean | null | undefined | object>>;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Resolves a single `EffectorQueryKey` element to its runtime value type:
|
|
16
|
+
* `Store<T>` → `T`, everything else is left as-is. Used by `ResolvedQueryKey`
|
|
17
|
+
* so `queryFn`'s context can present `queryKey` with stores already unwrapped.
|
|
18
|
+
*/
|
|
19
|
+
type ResolveQueryKeyElement<T> = T extends Store<infer U> ? U : T;
|
|
20
|
+
/**
|
|
21
|
+
* Tuple-aware mapping that walks an `EffectorQueryKey` and replaces each
|
|
22
|
+
* `Store<T>` with `T`, preserving tuple shape (length, readonly-ness, element
|
|
23
|
+
* positions). Drives the `TQueryKey` generic of `CreateQueryOptions` so the
|
|
24
|
+
* `queryFn({ queryKey })` parameter is typed with the resolved values:
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* const $name = createStore<string>('pikachu')
|
|
28
|
+
* createQuery({
|
|
29
|
+
* queryKey: ['pokemon', $name],
|
|
30
|
+
* queryFn: ({ queryKey }) => fetchByName(queryKey[1]),
|
|
31
|
+
* // ^ string — no cast needed
|
|
32
|
+
* })
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
type ResolvedQueryKey<T extends ReadonlyArray<unknown>> = {
|
|
36
|
+
readonly [K in keyof T]: ResolveQueryKeyElement<T[K]>;
|
|
37
|
+
};
|
|
38
|
+
interface CreateQueryOptions<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends EffectorQueryKey = EffectorQueryKey> extends Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryFnData, ResolvedQueryKey<TQueryKey>>, 'queryKey' | 'enabled' | 'refetchInterval'> {
|
|
39
|
+
queryKey: TQueryKey;
|
|
16
40
|
enabled?: StoreOrValue<boolean>;
|
|
17
41
|
/**
|
|
18
42
|
* Polling interval in milliseconds, `false` to disable, or a Store for
|
|
@@ -21,7 +45,7 @@ interface CreateQueryOptions<TQueryFnData = unknown, TError = Error, TData = TQu
|
|
|
21
45
|
* `setOptions` on every store change. The function form (`(query) => …`)
|
|
22
46
|
* from TanStack Query is also still supported.
|
|
23
47
|
*/
|
|
24
|
-
refetchInterval?: QueryObserverOptions<TQueryFnData, TError, TData
|
|
48
|
+
refetchInterval?: QueryObserverOptions<TQueryFnData, TError, TData, TQueryFnData, ResolvedQueryKey<TQueryKey>>['refetchInterval'] | Store<number | false | undefined>;
|
|
25
49
|
/**
|
|
26
50
|
* Stable name used to derive SIDs for the internal effector stores so that
|
|
27
51
|
* `serialize(scope)` / `fork({ values })` round-trip works for SSR. Without
|
|
@@ -95,11 +119,11 @@ interface QueryResult<TData, TError = Error> {
|
|
|
95
119
|
*/
|
|
96
120
|
$queryClient: Store<QueryClient | null>;
|
|
97
121
|
}
|
|
98
|
-
interface CreateInfiniteQueryOptions<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam
|
|
99
|
-
queryKey:
|
|
122
|
+
interface CreateInfiniteQueryOptions<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam>, TQueryKey extends EffectorQueryKey = EffectorQueryKey> extends Omit<InfiniteQueryObserverOptions<TQueryFnData, TError, TData, ResolvedQueryKey<TQueryKey>, TPageParam>, 'queryKey' | 'enabled' | 'refetchInterval'> {
|
|
123
|
+
queryKey: TQueryKey;
|
|
100
124
|
enabled?: StoreOrValue<boolean>;
|
|
101
125
|
/** See {@link CreateQueryOptions.refetchInterval}. */
|
|
102
|
-
refetchInterval?: InfiniteQueryObserverOptions<TQueryFnData, TError, TData,
|
|
126
|
+
refetchInterval?: InfiniteQueryObserverOptions<TQueryFnData, TError, TData, ResolvedQueryKey<TQueryKey>, TPageParam>['refetchInterval'] | Store<number | false | undefined>;
|
|
103
127
|
/** See {@link CreateQueryOptions.name}. */
|
|
104
128
|
name?: string;
|
|
105
129
|
}
|
|
@@ -206,4 +230,4 @@ interface MutationResult<TData = unknown, TError = Error, TVariables = void> {
|
|
|
206
230
|
};
|
|
207
231
|
}
|
|
208
232
|
|
|
209
|
-
export type { CreateInfiniteQueryOptions, CreateMutationOptions, CreateQueryOptions, EffectorQueryKey, InfiniteQueryResult, MutationResult, MutationStatus, QueryResult, StoreOrValue };
|
|
233
|
+
export type { CreateInfiniteQueryOptions, CreateMutationOptions, CreateQueryOptions, EffectorQueryKey, InfiniteQueryResult, MutationResult, MutationStatus, QueryResult, ResolveQueryKeyElement, ResolvedQueryKey, StoreOrValue };
|
package/dist/types.d.ts
CHANGED
|
@@ -11,8 +11,32 @@ type StoreOrValue<T> = Store<T> | T;
|
|
|
11
11
|
* queryKey: ['user', $userId, 'details']
|
|
12
12
|
*/
|
|
13
13
|
type EffectorQueryKey = ReadonlyArray<StoreOrValue<string | number | bigint | boolean | null | undefined | object>>;
|
|
14
|
-
|
|
15
|
-
|
|
14
|
+
/**
|
|
15
|
+
* Resolves a single `EffectorQueryKey` element to its runtime value type:
|
|
16
|
+
* `Store<T>` → `T`, everything else is left as-is. Used by `ResolvedQueryKey`
|
|
17
|
+
* so `queryFn`'s context can present `queryKey` with stores already unwrapped.
|
|
18
|
+
*/
|
|
19
|
+
type ResolveQueryKeyElement<T> = T extends Store<infer U> ? U : T;
|
|
20
|
+
/**
|
|
21
|
+
* Tuple-aware mapping that walks an `EffectorQueryKey` and replaces each
|
|
22
|
+
* `Store<T>` with `T`, preserving tuple shape (length, readonly-ness, element
|
|
23
|
+
* positions). Drives the `TQueryKey` generic of `CreateQueryOptions` so the
|
|
24
|
+
* `queryFn({ queryKey })` parameter is typed with the resolved values:
|
|
25
|
+
*
|
|
26
|
+
* ```ts
|
|
27
|
+
* const $name = createStore<string>('pikachu')
|
|
28
|
+
* createQuery({
|
|
29
|
+
* queryKey: ['pokemon', $name],
|
|
30
|
+
* queryFn: ({ queryKey }) => fetchByName(queryKey[1]),
|
|
31
|
+
* // ^ string — no cast needed
|
|
32
|
+
* })
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
type ResolvedQueryKey<T extends ReadonlyArray<unknown>> = {
|
|
36
|
+
readonly [K in keyof T]: ResolveQueryKeyElement<T[K]>;
|
|
37
|
+
};
|
|
38
|
+
interface CreateQueryOptions<TQueryFnData = unknown, TError = Error, TData = TQueryFnData, TQueryKey extends EffectorQueryKey = EffectorQueryKey> extends Omit<QueryObserverOptions<TQueryFnData, TError, TData, TQueryFnData, ResolvedQueryKey<TQueryKey>>, 'queryKey' | 'enabled' | 'refetchInterval'> {
|
|
39
|
+
queryKey: TQueryKey;
|
|
16
40
|
enabled?: StoreOrValue<boolean>;
|
|
17
41
|
/**
|
|
18
42
|
* Polling interval in milliseconds, `false` to disable, or a Store for
|
|
@@ -21,7 +45,7 @@ interface CreateQueryOptions<TQueryFnData = unknown, TError = Error, TData = TQu
|
|
|
21
45
|
* `setOptions` on every store change. The function form (`(query) => …`)
|
|
22
46
|
* from TanStack Query is also still supported.
|
|
23
47
|
*/
|
|
24
|
-
refetchInterval?: QueryObserverOptions<TQueryFnData, TError, TData
|
|
48
|
+
refetchInterval?: QueryObserverOptions<TQueryFnData, TError, TData, TQueryFnData, ResolvedQueryKey<TQueryKey>>['refetchInterval'] | Store<number | false | undefined>;
|
|
25
49
|
/**
|
|
26
50
|
* Stable name used to derive SIDs for the internal effector stores so that
|
|
27
51
|
* `serialize(scope)` / `fork({ values })` round-trip works for SSR. Without
|
|
@@ -95,11 +119,11 @@ interface QueryResult<TData, TError = Error> {
|
|
|
95
119
|
*/
|
|
96
120
|
$queryClient: Store<QueryClient | null>;
|
|
97
121
|
}
|
|
98
|
-
interface CreateInfiniteQueryOptions<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam
|
|
99
|
-
queryKey:
|
|
122
|
+
interface CreateInfiniteQueryOptions<TQueryFnData = unknown, TError = Error, TPageParam = unknown, TData = InfiniteData<TQueryFnData, TPageParam>, TQueryKey extends EffectorQueryKey = EffectorQueryKey> extends Omit<InfiniteQueryObserverOptions<TQueryFnData, TError, TData, ResolvedQueryKey<TQueryKey>, TPageParam>, 'queryKey' | 'enabled' | 'refetchInterval'> {
|
|
123
|
+
queryKey: TQueryKey;
|
|
100
124
|
enabled?: StoreOrValue<boolean>;
|
|
101
125
|
/** See {@link CreateQueryOptions.refetchInterval}. */
|
|
102
|
-
refetchInterval?: InfiniteQueryObserverOptions<TQueryFnData, TError, TData,
|
|
126
|
+
refetchInterval?: InfiniteQueryObserverOptions<TQueryFnData, TError, TData, ResolvedQueryKey<TQueryKey>, TPageParam>['refetchInterval'] | Store<number | false | undefined>;
|
|
103
127
|
/** See {@link CreateQueryOptions.name}. */
|
|
104
128
|
name?: string;
|
|
105
129
|
}
|
|
@@ -206,4 +230,4 @@ interface MutationResult<TData = unknown, TError = Error, TVariables = void> {
|
|
|
206
230
|
};
|
|
207
231
|
}
|
|
208
232
|
|
|
209
|
-
export type { CreateInfiniteQueryOptions, CreateMutationOptions, CreateQueryOptions, EffectorQueryKey, InfiniteQueryResult, MutationResult, MutationStatus, QueryResult, StoreOrValue };
|
|
233
|
+
export type { CreateInfiniteQueryOptions, CreateMutationOptions, CreateQueryOptions, EffectorQueryKey, InfiniteQueryResult, MutationResult, MutationStatus, QueryResult, ResolveQueryKeyElement, ResolvedQueryKey, StoreOrValue };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@effector-tanstack-query/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Effector bindings for TanStack Query — core factories (createQuery, createMutation, createInfiniteQuery)",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Ilya Agarkov <ilya.al.ag@gmail.com>",
|
|
@@ -44,7 +44,7 @@
|
|
|
44
44
|
],
|
|
45
45
|
"sideEffects": false,
|
|
46
46
|
"dependencies": {
|
|
47
|
-
"@tanstack/query-core": "^5.
|
|
47
|
+
"@tanstack/query-core": "^5.100.10"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
50
|
"effector": ">=23.0.0"
|
|
@@ -9,6 +9,7 @@ import { createBaseQuery, sidConfig, warnMissingName } from './createBaseQuery'
|
|
|
9
9
|
import { resolveReactiveRefetchInterval } from './resolve'
|
|
10
10
|
import type {
|
|
11
11
|
CreateInfiniteQueryOptions,
|
|
12
|
+
EffectorQueryKey,
|
|
12
13
|
InfiniteQueryResult,
|
|
13
14
|
} from './types'
|
|
14
15
|
|
|
@@ -29,34 +30,62 @@ export function createInfiniteQuery<
|
|
|
29
30
|
TError = Error,
|
|
30
31
|
TPageParam = unknown,
|
|
31
32
|
TData = InfiniteData<TQueryFnData, TPageParam>,
|
|
33
|
+
const TQueryKey extends EffectorQueryKey = EffectorQueryKey,
|
|
32
34
|
>(
|
|
33
|
-
options: CreateInfiniteQueryOptions<
|
|
35
|
+
options: CreateInfiniteQueryOptions<
|
|
36
|
+
TQueryFnData,
|
|
37
|
+
TError,
|
|
38
|
+
TPageParam,
|
|
39
|
+
TData,
|
|
40
|
+
TQueryKey
|
|
41
|
+
>,
|
|
34
42
|
): InfiniteQueryResult<TData, TError, TPageParam>
|
|
35
43
|
export function createInfiniteQuery<
|
|
36
44
|
TQueryFnData = unknown,
|
|
37
45
|
TError = Error,
|
|
38
46
|
TPageParam = unknown,
|
|
39
47
|
TData = InfiniteData<TQueryFnData, TPageParam>,
|
|
48
|
+
const TQueryKey extends EffectorQueryKey = EffectorQueryKey,
|
|
40
49
|
>(
|
|
41
50
|
queryClient: QueryClient,
|
|
42
|
-
options: CreateInfiniteQueryOptions<
|
|
51
|
+
options: CreateInfiniteQueryOptions<
|
|
52
|
+
TQueryFnData,
|
|
53
|
+
TError,
|
|
54
|
+
TPageParam,
|
|
55
|
+
TData,
|
|
56
|
+
TQueryKey
|
|
57
|
+
>,
|
|
43
58
|
): InfiniteQueryResult<TData, TError, TPageParam>
|
|
44
59
|
export function createInfiniteQuery<
|
|
45
60
|
TQueryFnData = unknown,
|
|
46
61
|
TError = Error,
|
|
47
62
|
TPageParam = unknown,
|
|
48
63
|
TData = InfiniteData<TQueryFnData, TPageParam>,
|
|
64
|
+
const TQueryKey extends EffectorQueryKey = EffectorQueryKey,
|
|
49
65
|
>(
|
|
50
66
|
arg1:
|
|
51
67
|
| QueryClient
|
|
52
|
-
| CreateInfiniteQueryOptions<
|
|
53
|
-
|
|
68
|
+
| CreateInfiniteQueryOptions<
|
|
69
|
+
TQueryFnData,
|
|
70
|
+
TError,
|
|
71
|
+
TPageParam,
|
|
72
|
+
TData,
|
|
73
|
+
TQueryKey
|
|
74
|
+
>,
|
|
75
|
+
arg2?: CreateInfiniteQueryOptions<
|
|
76
|
+
TQueryFnData,
|
|
77
|
+
TError,
|
|
78
|
+
TPageParam,
|
|
79
|
+
TData,
|
|
80
|
+
TQueryKey
|
|
81
|
+
>,
|
|
54
82
|
): InfiniteQueryResult<TData, TError, TPageParam> {
|
|
55
83
|
const [explicitClient, options] = parseInfiniteArgs<
|
|
56
84
|
TQueryFnData,
|
|
57
85
|
TError,
|
|
58
86
|
TPageParam,
|
|
59
|
-
TData
|
|
87
|
+
TData,
|
|
88
|
+
TQueryKey
|
|
60
89
|
>(arg1, arg2)
|
|
61
90
|
const { queryKey, enabled, name, ...restOptions } = options
|
|
62
91
|
|
|
@@ -272,20 +301,50 @@ export function createInfiniteQuery<
|
|
|
272
301
|
return result
|
|
273
302
|
}
|
|
274
303
|
|
|
275
|
-
function parseInfiniteArgs<
|
|
304
|
+
function parseInfiniteArgs<
|
|
305
|
+
TQueryFnData,
|
|
306
|
+
TError,
|
|
307
|
+
TPageParam,
|
|
308
|
+
TData,
|
|
309
|
+
TQueryKey extends EffectorQueryKey,
|
|
310
|
+
>(
|
|
276
311
|
arg1:
|
|
277
312
|
| QueryClient
|
|
278
|
-
| CreateInfiniteQueryOptions<
|
|
279
|
-
|
|
313
|
+
| CreateInfiniteQueryOptions<
|
|
314
|
+
TQueryFnData,
|
|
315
|
+
TError,
|
|
316
|
+
TPageParam,
|
|
317
|
+
TData,
|
|
318
|
+
TQueryKey
|
|
319
|
+
>,
|
|
320
|
+
arg2?: CreateInfiniteQueryOptions<
|
|
321
|
+
TQueryFnData,
|
|
322
|
+
TError,
|
|
323
|
+
TPageParam,
|
|
324
|
+
TData,
|
|
325
|
+
TQueryKey
|
|
326
|
+
>,
|
|
280
327
|
): [
|
|
281
328
|
QueryClient | null,
|
|
282
|
-
CreateInfiniteQueryOptions<
|
|
329
|
+
CreateInfiniteQueryOptions<
|
|
330
|
+
TQueryFnData,
|
|
331
|
+
TError,
|
|
332
|
+
TPageParam,
|
|
333
|
+
TData,
|
|
334
|
+
TQueryKey
|
|
335
|
+
>,
|
|
283
336
|
] {
|
|
284
337
|
if (arg2 !== undefined) {
|
|
285
338
|
return [arg1 as QueryClient, arg2]
|
|
286
339
|
}
|
|
287
340
|
return [
|
|
288
341
|
null,
|
|
289
|
-
arg1 as CreateInfiniteQueryOptions<
|
|
342
|
+
arg1 as CreateInfiniteQueryOptions<
|
|
343
|
+
TQueryFnData,
|
|
344
|
+
TError,
|
|
345
|
+
TPageParam,
|
|
346
|
+
TData,
|
|
347
|
+
TQueryKey
|
|
348
|
+
>,
|
|
290
349
|
]
|
|
291
350
|
}
|
package/src/createQuery.ts
CHANGED
|
@@ -3,37 +3,46 @@ import { QueryObserver } from '@tanstack/query-core'
|
|
|
3
3
|
import type { QueryClient } from '@tanstack/query-core'
|
|
4
4
|
import { createBaseQuery, warnMissingName } from './createBaseQuery'
|
|
5
5
|
import { resolveReactiveRefetchInterval } from './resolve'
|
|
6
|
-
import type {
|
|
6
|
+
import type {
|
|
7
|
+
CreateQueryOptions,
|
|
8
|
+
EffectorQueryKey,
|
|
9
|
+
QueryResult,
|
|
10
|
+
} from './types'
|
|
7
11
|
|
|
8
12
|
export function createQuery<
|
|
9
13
|
TQueryFnData = unknown,
|
|
10
14
|
TError = Error,
|
|
11
15
|
TData = TQueryFnData,
|
|
16
|
+
const TQueryKey extends EffectorQueryKey = EffectorQueryKey,
|
|
12
17
|
>(
|
|
13
|
-
options: CreateQueryOptions<TQueryFnData, TError, TData>,
|
|
18
|
+
options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
14
19
|
): QueryResult<TData, TError>
|
|
15
20
|
export function createQuery<
|
|
16
21
|
TQueryFnData = unknown,
|
|
17
22
|
TError = Error,
|
|
18
23
|
TData = TQueryFnData,
|
|
24
|
+
const TQueryKey extends EffectorQueryKey = EffectorQueryKey,
|
|
19
25
|
>(
|
|
20
26
|
queryClient: QueryClient,
|
|
21
|
-
options: CreateQueryOptions<TQueryFnData, TError, TData>,
|
|
27
|
+
options: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
22
28
|
): QueryResult<TData, TError>
|
|
23
29
|
export function createQuery<
|
|
24
30
|
TQueryFnData = unknown,
|
|
25
31
|
TError = Error,
|
|
26
32
|
TData = TQueryFnData,
|
|
33
|
+
const TQueryKey extends EffectorQueryKey = EffectorQueryKey,
|
|
27
34
|
>(
|
|
28
35
|
arg1:
|
|
29
36
|
| QueryClient
|
|
30
|
-
| CreateQueryOptions<TQueryFnData, TError, TData>,
|
|
31
|
-
arg2?: CreateQueryOptions<TQueryFnData, TError, TData>,
|
|
37
|
+
| CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
38
|
+
arg2?: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
32
39
|
): QueryResult<TData, TError> {
|
|
33
|
-
const [explicitClient, options] = parseQueryArgs<
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
const [explicitClient, options] = parseQueryArgs<
|
|
41
|
+
TQueryFnData,
|
|
42
|
+
TError,
|
|
43
|
+
TData,
|
|
44
|
+
TQueryKey
|
|
45
|
+
>(arg1, arg2)
|
|
37
46
|
const { queryKey, enabled, name, ...restOptions } = options
|
|
38
47
|
|
|
39
48
|
if (!name) warnMissingName('createQuery')
|
|
@@ -142,14 +151,25 @@ export function createQuery<
|
|
|
142
151
|
return result
|
|
143
152
|
}
|
|
144
153
|
|
|
145
|
-
function parseQueryArgs<
|
|
154
|
+
function parseQueryArgs<
|
|
155
|
+
TQueryFnData,
|
|
156
|
+
TError,
|
|
157
|
+
TData,
|
|
158
|
+
TQueryKey extends EffectorQueryKey,
|
|
159
|
+
>(
|
|
146
160
|
arg1:
|
|
147
161
|
| QueryClient
|
|
148
|
-
| CreateQueryOptions<TQueryFnData, TError, TData>,
|
|
149
|
-
arg2?: CreateQueryOptions<TQueryFnData, TError, TData>,
|
|
150
|
-
): [
|
|
162
|
+
| CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
163
|
+
arg2?: CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
164
|
+
): [
|
|
165
|
+
QueryClient | null,
|
|
166
|
+
CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
167
|
+
] {
|
|
151
168
|
if (arg2 !== undefined) {
|
|
152
169
|
return [arg1 as QueryClient, arg2]
|
|
153
170
|
}
|
|
154
|
-
return [
|
|
171
|
+
return [
|
|
172
|
+
null,
|
|
173
|
+
arg1 as CreateQueryOptions<TQueryFnData, TError, TData, TQueryKey>,
|
|
174
|
+
]
|
|
155
175
|
}
|
package/src/index.ts
CHANGED
|
@@ -4,6 +4,11 @@ export { createMutation } from './createMutation'
|
|
|
4
4
|
export { createInvalidate } from './createInvalidate'
|
|
5
5
|
export type { CreateInvalidateOptions } from './createInvalidate'
|
|
6
6
|
export { $queryClient, setQueryClient } from './queryClient'
|
|
7
|
+
export { prefetchQueries } from './prefetchQueries'
|
|
8
|
+
export type {
|
|
9
|
+
PrefetchableQuery,
|
|
10
|
+
PrefetchQueriesConfig,
|
|
11
|
+
} from './prefetchQueries'
|
|
7
12
|
export type {
|
|
8
13
|
CreateInfiniteQueryOptions,
|
|
9
14
|
CreateMutationOptions,
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { allSettled } from 'effector'
|
|
2
|
+
import type { EventCallable, Scope } from 'effector'
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Structural shape of any factory result that exposes the two SSR
|
|
6
|
+
* lifecycle events. Both `QueryResult` and `InfiniteQueryResult` satisfy
|
|
7
|
+
* this without forcing the caller to widen their `TData` / `TError` type
|
|
8
|
+
* parameters.
|
|
9
|
+
*/
|
|
10
|
+
export interface PrefetchableQuery {
|
|
11
|
+
prefetch: EventCallable<void>
|
|
12
|
+
mounted: EventCallable<void>
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
export interface PrefetchQueriesConfig {
|
|
16
|
+
/** Scope to run the lifecycle events in. Required — `allSettled` cannot
|
|
17
|
+
* await unit triggers outside of a scope. */
|
|
18
|
+
scope: Scope
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Server-side helper that fills **both** SSR layers for a set of queries:
|
|
23
|
+
*
|
|
24
|
+
* 1. `await allSettled(q.prefetch, { scope })` for each query — awaits
|
|
25
|
+
* `queryClient.fetchQuery(...)` so by the time the promise resolves
|
|
26
|
+
* the cache holds the data.
|
|
27
|
+
* 2. `await allSettled(q.mounted, { scope })` for each query — creates
|
|
28
|
+
* the per-scope observer; its synchronous `getCurrentResult()`
|
|
29
|
+
* dispatch reads from the now-populated cache and writes into the
|
|
30
|
+
* effector stores (`$data`, `$status`, …). This is what makes
|
|
31
|
+
* `serialize(scope)` ship populated stores, which in turn lets the
|
|
32
|
+
* server-rendered HTML show data on first paint.
|
|
33
|
+
*
|
|
34
|
+
* Skipping step 2 (calling only `prefetch`) leaves the effector stores at
|
|
35
|
+
* their defaults — `serialize(scope)` returns nothing useful, the
|
|
36
|
+
* server-rendered HTML shows loading, and the user sees a flash on
|
|
37
|
+
* hydration. This helper exists so that bug is impossible to write.
|
|
38
|
+
*
|
|
39
|
+
* Both phases run in parallel within themselves (`Promise.all`) but
|
|
40
|
+
* sequentially across phases (`mounted` must see a populated cache).
|
|
41
|
+
*
|
|
42
|
+
* Snapshot the layers yourself afterwards — `dehydrate(queryClient)` for
|
|
43
|
+
* the cache and `serialize(scope)` for the stores — and ship both to the
|
|
44
|
+
* client (e.g. via `<HydrationBoundary state={...}>` + `<EffectorNext
|
|
45
|
+
* values={...}>` or `fork({ values: ... })`).
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* const queryClient = new QueryClient()
|
|
50
|
+
* const scope = fork({ values: [[$queryClient, queryClient]] })
|
|
51
|
+
*
|
|
52
|
+
* await prefetchQueries([listQuery, pokemonQuery], { scope })
|
|
53
|
+
*
|
|
54
|
+
* return {
|
|
55
|
+
* dehydratedQueryClient: dehydrate(queryClient),
|
|
56
|
+
* serializedScope: serialize(scope),
|
|
57
|
+
* }
|
|
58
|
+
* ```
|
|
59
|
+
*/
|
|
60
|
+
export async function prefetchQueries(
|
|
61
|
+
queries: ReadonlyArray<PrefetchableQuery>,
|
|
62
|
+
config: PrefetchQueriesConfig,
|
|
63
|
+
): Promise<void> {
|
|
64
|
+
const { scope } = config
|
|
65
|
+
await Promise.all(queries.map((q) => allSettled(q.prefetch, { scope })))
|
|
66
|
+
await Promise.all(queries.map((q) => allSettled(q.mounted, { scope })))
|
|
67
|
+
}
|
package/src/types.ts
CHANGED
|
@@ -28,15 +28,48 @@ export type EffectorQueryKey = ReadonlyArray<
|
|
|
28
28
|
StoreOrValue<string | number | bigint | boolean | null | undefined | object>
|
|
29
29
|
>
|
|
30
30
|
|
|
31
|
+
/**
|
|
32
|
+
* Resolves a single `EffectorQueryKey` element to its runtime value type:
|
|
33
|
+
* `Store<T>` → `T`, everything else is left as-is. Used by `ResolvedQueryKey`
|
|
34
|
+
* so `queryFn`'s context can present `queryKey` with stores already unwrapped.
|
|
35
|
+
*/
|
|
36
|
+
export type ResolveQueryKeyElement<T> = T extends Store<infer U> ? U : T
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Tuple-aware mapping that walks an `EffectorQueryKey` and replaces each
|
|
40
|
+
* `Store<T>` with `T`, preserving tuple shape (length, readonly-ness, element
|
|
41
|
+
* positions). Drives the `TQueryKey` generic of `CreateQueryOptions` so the
|
|
42
|
+
* `queryFn({ queryKey })` parameter is typed with the resolved values:
|
|
43
|
+
*
|
|
44
|
+
* ```ts
|
|
45
|
+
* const $name = createStore<string>('pikachu')
|
|
46
|
+
* createQuery({
|
|
47
|
+
* queryKey: ['pokemon', $name],
|
|
48
|
+
* queryFn: ({ queryKey }) => fetchByName(queryKey[1]),
|
|
49
|
+
* // ^ string — no cast needed
|
|
50
|
+
* })
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
export type ResolvedQueryKey<T extends ReadonlyArray<unknown>> = {
|
|
54
|
+
readonly [K in keyof T]: ResolveQueryKeyElement<T[K]>
|
|
55
|
+
}
|
|
56
|
+
|
|
31
57
|
export interface CreateQueryOptions<
|
|
32
58
|
TQueryFnData = unknown,
|
|
33
59
|
TError = Error,
|
|
34
60
|
TData = TQueryFnData,
|
|
61
|
+
TQueryKey extends EffectorQueryKey = EffectorQueryKey,
|
|
35
62
|
> extends Omit<
|
|
36
|
-
QueryObserverOptions<
|
|
63
|
+
QueryObserverOptions<
|
|
64
|
+
TQueryFnData,
|
|
65
|
+
TError,
|
|
66
|
+
TData,
|
|
67
|
+
TQueryFnData,
|
|
68
|
+
ResolvedQueryKey<TQueryKey>
|
|
69
|
+
>,
|
|
37
70
|
'queryKey' | 'enabled' | 'refetchInterval'
|
|
38
71
|
> {
|
|
39
|
-
queryKey:
|
|
72
|
+
queryKey: TQueryKey
|
|
40
73
|
enabled?: StoreOrValue<boolean>
|
|
41
74
|
/**
|
|
42
75
|
* Polling interval in milliseconds, `false` to disable, or a Store for
|
|
@@ -46,7 +79,13 @@ export interface CreateQueryOptions<
|
|
|
46
79
|
* from TanStack Query is also still supported.
|
|
47
80
|
*/
|
|
48
81
|
refetchInterval?:
|
|
49
|
-
| QueryObserverOptions<
|
|
82
|
+
| QueryObserverOptions<
|
|
83
|
+
TQueryFnData,
|
|
84
|
+
TError,
|
|
85
|
+
TData,
|
|
86
|
+
TQueryFnData,
|
|
87
|
+
ResolvedQueryKey<TQueryKey>
|
|
88
|
+
>['refetchInterval']
|
|
50
89
|
| Store<number | false | undefined>
|
|
51
90
|
/**
|
|
52
91
|
* Stable name used to derive SIDs for the internal effector stores so that
|
|
@@ -128,17 +167,18 @@ export interface CreateInfiniteQueryOptions<
|
|
|
128
167
|
TError = Error,
|
|
129
168
|
TPageParam = unknown,
|
|
130
169
|
TData = InfiniteData<TQueryFnData, TPageParam>,
|
|
170
|
+
TQueryKey extends EffectorQueryKey = EffectorQueryKey,
|
|
131
171
|
> extends Omit<
|
|
132
172
|
InfiniteQueryObserverOptions<
|
|
133
173
|
TQueryFnData,
|
|
134
174
|
TError,
|
|
135
175
|
TData,
|
|
136
|
-
|
|
176
|
+
ResolvedQueryKey<TQueryKey>,
|
|
137
177
|
TPageParam
|
|
138
178
|
>,
|
|
139
179
|
'queryKey' | 'enabled' | 'refetchInterval'
|
|
140
180
|
> {
|
|
141
|
-
queryKey:
|
|
181
|
+
queryKey: TQueryKey
|
|
142
182
|
enabled?: StoreOrValue<boolean>
|
|
143
183
|
/** See {@link CreateQueryOptions.refetchInterval}. */
|
|
144
184
|
refetchInterval?:
|
|
@@ -146,7 +186,7 @@ export interface CreateInfiniteQueryOptions<
|
|
|
146
186
|
TQueryFnData,
|
|
147
187
|
TError,
|
|
148
188
|
TData,
|
|
149
|
-
|
|
189
|
+
ResolvedQueryKey<TQueryKey>,
|
|
150
190
|
TPageParam
|
|
151
191
|
>['refetchInterval']
|
|
152
192
|
| Store<number | false | undefined>
|