floppy-disk 2.16.0 → 3.0.0-alpha.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/README.md +0 -835
  2. package/esm/index.d.mts +1 -0
  3. package/esm/index.mjs +1 -0
  4. package/esm/react/create-mutation.d.mts +135 -0
  5. package/esm/react/create-query.d.mts +319 -0
  6. package/esm/react/create-store.d.mts +25 -0
  7. package/esm/react/create-stores.d.mts +32 -0
  8. package/esm/react/use-isomorphic-layout-effect.d.mts +6 -0
  9. package/esm/react/use-store.d.mts +18 -0
  10. package/esm/react.d.mts +6 -0
  11. package/esm/react.mjs +503 -0
  12. package/esm/vanilla/basic.d.mts +21 -0
  13. package/esm/vanilla/hash.d.mts +7 -0
  14. package/esm/vanilla/shallow.d.mts +6 -0
  15. package/esm/vanilla/store.d.mts +75 -0
  16. package/esm/vanilla.d.mts +4 -0
  17. package/esm/vanilla.mjs +109 -0
  18. package/index.d.ts +1 -0
  19. package/index.js +12 -0
  20. package/package.json +50 -45
  21. package/react/create-mutation.d.ts +135 -0
  22. package/react/create-query.d.ts +319 -0
  23. package/react/create-store.d.ts +25 -0
  24. package/react/create-stores.d.ts +32 -0
  25. package/react/use-isomorphic-layout-effect.d.ts +6 -0
  26. package/react/use-store.d.ts +18 -0
  27. package/{lib/index.d.ts → react.d.ts} +2 -4
  28. package/react.js +511 -0
  29. package/ts_version_4.5_and_above_is_required.d.ts +0 -0
  30. package/vanilla/basic.d.ts +21 -0
  31. package/vanilla/hash.d.ts +7 -0
  32. package/vanilla/shallow.d.ts +6 -0
  33. package/vanilla/store.d.ts +75 -0
  34. package/vanilla.d.ts +4 -0
  35. package/vanilla.js +118 -0
  36. package/esm/fetcher.d.ts +0 -27
  37. package/esm/fetcher.js +0 -95
  38. package/esm/index.d.ts +0 -8
  39. package/esm/index.js +0 -8
  40. package/esm/react/create-bi-direction-query.d.ts +0 -166
  41. package/esm/react/create-bi-direction-query.js +0 -74
  42. package/esm/react/create-mutation.d.ts +0 -39
  43. package/esm/react/create-mutation.js +0 -56
  44. package/esm/react/create-query.d.ts +0 -319
  45. package/esm/react/create-query.js +0 -434
  46. package/esm/react/create-store.d.ts +0 -51
  47. package/esm/react/create-store.js +0 -38
  48. package/esm/react/create-stores.d.ts +0 -77
  49. package/esm/react/create-stores.js +0 -125
  50. package/esm/react/with-context.d.ts +0 -5
  51. package/esm/react/with-context.js +0 -14
  52. package/esm/store.d.ts +0 -24
  53. package/esm/store.js +0 -51
  54. package/esm/utils.d.ts +0 -24
  55. package/esm/utils.js +0 -31
  56. package/lib/fetcher.d.ts +0 -27
  57. package/lib/fetcher.js +0 -99
  58. package/lib/index.js +0 -11
  59. package/lib/react/create-bi-direction-query.d.ts +0 -166
  60. package/lib/react/create-bi-direction-query.js +0 -78
  61. package/lib/react/create-mutation.d.ts +0 -39
  62. package/lib/react/create-mutation.js +0 -60
  63. package/lib/react/create-query.d.ts +0 -319
  64. package/lib/react/create-query.js +0 -438
  65. package/lib/react/create-store.d.ts +0 -51
  66. package/lib/react/create-store.js +0 -42
  67. package/lib/react/create-stores.d.ts +0 -77
  68. package/lib/react/create-stores.js +0 -130
  69. package/lib/react/with-context.d.ts +0 -5
  70. package/lib/react/with-context.js +0 -18
  71. package/lib/store.d.ts +0 -24
  72. package/lib/store.js +0 -55
  73. package/lib/utils.d.ts +0 -24
  74. package/lib/utils.js +0 -39
  75. package/utils/package.json +0 -6
@@ -1,125 +0,0 @@
1
- import { useEffect, useMemo, useRef, useState } from 'react';
2
- import { initStore, } from '../store';
3
- import { getValue, noop } from '../utils';
4
- const hasObjectPrototype = (value) => {
5
- return Object.prototype.toString.call(value) === '[object Object]';
6
- };
7
- const isPlainObject = (value) => {
8
- if (!hasObjectPrototype(value))
9
- return false;
10
- const ctor = value.constructor;
11
- if (typeof ctor === 'undefined')
12
- return true;
13
- const prot = ctor.prototype;
14
- if (!hasObjectPrototype(prot))
15
- return false;
16
- if (!prot.hasOwnProperty('isPrototypeOf'))
17
- return false;
18
- return true;
19
- };
20
- export const hashStoreKey = (value) =>
21
- // Copied from: https://github.com/TanStack/query/blob/main/packages/query-core/src/utils.ts
22
- JSON.stringify(value, (_, val) => isPlainObject(val)
23
- ? Object.keys(val)
24
- .sort()
25
- .reduce((result, key) => {
26
- result[key] = val[key];
27
- return result;
28
- }, {})
29
- : val);
30
- /**
31
- * @see https://floppy-disk.vercel.app/docs/api#createstores
32
- */
33
- export const createStores = (initializer, options = {}) => {
34
- const { onBeforeChangeKey = noop, onStoreInitialized = noop, defaultDeps, hashKeyFn = hashStoreKey, } = options;
35
- const stores = new Map();
36
- const getStore = (_key) => {
37
- const key = _key || {};
38
- const keyHash = hashKeyFn(key);
39
- if (!stores.has(keyHash)) {
40
- stores.set(keyHash, initStore((api) => getValue(initializer, { key, keyHash, ...api }), options));
41
- onStoreInitialized(key, keyHash);
42
- }
43
- return stores.get(keyHash);
44
- };
45
- /**
46
- * **IMPORTANT NOTE:** `selectDeps` function must not be changed after initialization.
47
- */
48
- const useStores = (...args) => {
49
- const [_key, selectDeps = defaultDeps] = (typeof args[0] === 'function' || typeof args[0] === 'string' ? [{}, args[0]] : args);
50
- const key = _key || {};
51
- const keyHash = hashKeyFn(key);
52
- // eslint-disable-next-line react-hooks/exhaustive-deps
53
- const { get, subscribe } = useMemo(() => getStore(key), [keyHash]);
54
- const [, setState] = useState(get);
55
- const prevKey = useRef(key);
56
- const prevKeyHash = useRef(keyHash);
57
- useEffect(() => {
58
- prevKey.current = key;
59
- prevKeyHash.current = keyHash;
60
- const unsubs = subscribe(setState, selectDeps);
61
- return unsubs;
62
- // eslint-disable-next-line react-hooks/exhaustive-deps
63
- }, [keyHash]);
64
- if (keyHash !== prevKeyHash.current)
65
- onBeforeChangeKey(key, prevKey.current);
66
- const state = get();
67
- return (typeof selectDeps === 'string' ? state[selectDeps] : state);
68
- };
69
- useStores.get = (key) => {
70
- const store = getStore(key);
71
- return store.get();
72
- };
73
- useStores.getAll = () => {
74
- const allStores = [];
75
- stores.forEach((store) => {
76
- allStores.push(store.get());
77
- });
78
- return allStores;
79
- };
80
- useStores.getAllWithSubscriber = () => {
81
- const allStores = [];
82
- stores.forEach((store) => {
83
- const subscribers = store.getSubscribers();
84
- if (subscribers.size > 0)
85
- allStores.push(store.get());
86
- });
87
- return allStores;
88
- };
89
- useStores.set = (key, value, silent) => {
90
- const store = getStore(key);
91
- store.set(value, silent);
92
- };
93
- useStores.setAll = (value, silent) => {
94
- stores.forEach((store) => {
95
- store.set(value, silent);
96
- });
97
- };
98
- useStores.subscribe = (key, fn, selectDeps = defaultDeps) => {
99
- const store = getStore(key);
100
- return store.subscribe(fn, selectDeps);
101
- };
102
- useStores.getSubscribers = (key) => {
103
- const store = getStore(key);
104
- return store.getSubscribers();
105
- };
106
- useStores.getStore = (key) => getStore(key);
107
- useStores.getStores = () => stores;
108
- useStores.setDefaultValues = (key, value) => {
109
- // eslint-disable-next-line react-hooks/rules-of-hooks
110
- useState(() => {
111
- const store = getStore(key);
112
- const subscribers = store.getSubscribers();
113
- if (subscribers.size > 0) {
114
- console.warn('Put setDefaultValues on the root component or parent component, before any component subscribed!');
115
- }
116
- store.set(value);
117
- });
118
- };
119
- const Watch = ({ storeKey, selectDeps = defaultDeps, render, }) => {
120
- const store = useStores(storeKey, selectDeps);
121
- return render(store);
122
- };
123
- useStores.Watch = Watch;
124
- return useStores;
125
- };
@@ -1,5 +0,0 @@
1
- import { ReactNode } from 'react';
2
- export declare const withContext: <T>(initFn: () => T) => readonly [({ children, onInitialize, }: {
3
- children: ReactNode;
4
- onInitialize?: ((value: T) => void) | undefined;
5
- }) => import("react").FunctionComponentElement<import("react").ProviderProps<T | null>>, () => T | null];
@@ -1,14 +0,0 @@
1
- import { createContext, createElement, useContext, useState } from 'react';
2
- export const withContext = (initFn) => {
3
- const Context = createContext(null);
4
- const Provider = ({ children, onInitialize, }) => {
5
- const [value] = useState(() => {
6
- const store = initFn();
7
- onInitialize && onInitialize(store);
8
- return store;
9
- });
10
- return createElement(Context.Provider, { value, children });
11
- };
12
- const useCurrentContext = () => useContext(Context);
13
- return [Provider, useCurrentContext];
14
- };
package/esm/store.d.ts DELETED
@@ -1,24 +0,0 @@
1
- import { Maybe } from './utils';
2
- export type StoreData = Record<string, any>;
3
- export type SetStoreData<T> = Partial<T> | ((prevState: T) => Partial<T>);
4
- export type SelectDeps<T> = ((state: T) => any[]) | undefined | null;
5
- export type Subscribers<T> = Map<(state: T) => void, SelectDeps<T>>;
6
- export type StoreInitializer<T> = T | ((api: {
7
- get: () => T;
8
- set: (value: SetStoreData<T>, silent?: boolean) => void;
9
- }) => T);
10
- export type StoreEvent<T> = (state: T) => void;
11
- export type InitStoreOptions<T> = {
12
- intercept?: (nextState: T, prevState: T) => void | Maybe<Partial<T>>;
13
- onFirstSubscribe?: StoreEvent<T>;
14
- onSubscribe?: StoreEvent<T>;
15
- onUnsubscribe?: StoreEvent<T>;
16
- onLastUnsubscribe?: StoreEvent<T>;
17
- };
18
- export type InitStoreReturn<T> = {
19
- get: () => T;
20
- set: (value: SetStoreData<T>, silent?: boolean) => void;
21
- subscribe: (fn: (state: T) => void, selectDeps?: SelectDeps<T> | keyof T) => () => void;
22
- getSubscribers: () => Subscribers<T>;
23
- };
24
- export declare const initStore: <T extends StoreData>(initializer: StoreInitializer<T>, options?: InitStoreOptions<T>) => InitStoreReturn<T>;
package/esm/store.js DELETED
@@ -1,51 +0,0 @@
1
- import { getValue, noop } from './utils';
2
- export const initStore = (initializer, options = {}) => {
3
- const { intercept, onFirstSubscribe = noop, onSubscribe = noop, onUnsubscribe = noop, onLastUnsubscribe = noop, } = options;
4
- const subscribers = new Map();
5
- const getSubscribers = () => subscribers;
6
- let data;
7
- const get = () => data;
8
- const set = (value, silent = false) => {
9
- const prevData = data;
10
- data = { ...data, ...getValue(value, data) };
11
- if (intercept) {
12
- data = { ...data, ...intercept(data, prevData) };
13
- }
14
- if (silent)
15
- return;
16
- const keys = Object.keys(data);
17
- subscribers.forEach((selectDeps, fn) => {
18
- if (!selectDeps) {
19
- for (let i = 0, n = keys.length; i < n; i++) {
20
- if (prevData[keys[i]] !== data[keys[i]]) {
21
- fn(data);
22
- break;
23
- }
24
- }
25
- return;
26
- }
27
- const prevs = selectDeps(prevData);
28
- const nexts = selectDeps(data);
29
- for (let i = 0, n = prevs.length; i < n; i++) {
30
- if (prevs[i] !== nexts[i]) {
31
- fn(data);
32
- break;
33
- }
34
- }
35
- });
36
- };
37
- const subscribe = (fn, selectDeps) => {
38
- subscribers.set(fn, (typeof selectDeps === 'string' ? (s) => [s[selectDeps]] : selectDeps));
39
- if (subscribers.size === 1)
40
- onFirstSubscribe(data);
41
- onSubscribe(data);
42
- return () => {
43
- subscribers.delete(fn);
44
- onUnsubscribe(data);
45
- if (subscribers.size === 0)
46
- onLastUnsubscribe(data);
47
- };
48
- };
49
- data = getValue(initializer, { get, set });
50
- return { get, set, subscribe, getSubscribers };
51
- };
package/esm/utils.d.ts DELETED
@@ -1,24 +0,0 @@
1
- export type Maybe<T> = T | null | undefined;
2
- /**
3
- * Check if this runs on browser.
4
- */
5
- export declare const isClient: boolean;
6
- export declare const noop: () => void;
7
- export declare const identityFn: <T>(value: T) => T;
8
- /**
9
- * Check if a value is not undefined and not null.
10
- *
11
- * ```ts
12
- * const hasValue = (value: any) => value !== undefined && value !== null;
13
- * ```
14
- */
15
- export declare const hasValue: (value: any) => boolean;
16
- /**
17
- * If the value is a function, it will invoke the function.\
18
- * If the value is not a function, it will just return it.
19
- */
20
- export declare const getValue: <T, P extends any[]>(valueOrComputeValueFn: T | ((...params: P) => T), ...params: P) => T;
21
- /**
22
- * Create an Error instance with custom props.
23
- */
24
- export declare const createError: (message: string, props: Record<string, any>) => Error & Record<string, any>;
package/esm/utils.js DELETED
@@ -1,31 +0,0 @@
1
- /**
2
- * Check if this runs on browser.
3
- */
4
- export const isClient = typeof window !== 'undefined' && !('Deno' in window);
5
- export const noop = () => { };
6
- export const identityFn = (value) => value;
7
- /**
8
- * Check if a value is not undefined and not null.
9
- *
10
- * ```ts
11
- * const hasValue = (value: any) => value !== undefined && value !== null;
12
- * ```
13
- */
14
- export const hasValue = (value) => value !== undefined && value !== null;
15
- /**
16
- * If the value is a function, it will invoke the function.\
17
- * If the value is not a function, it will just return it.
18
- */
19
- export const getValue = (valueOrComputeValueFn, ...params) => {
20
- if (typeof valueOrComputeValueFn === 'function') {
21
- return valueOrComputeValueFn(...params);
22
- }
23
- return valueOrComputeValueFn;
24
- };
25
- /**
26
- * Create an Error instance with custom props.
27
- */
28
- export const createError = (message, props) => {
29
- const error = Object.assign(new Error(message), props);
30
- return error;
31
- };
package/lib/fetcher.d.ts DELETED
@@ -1,27 +0,0 @@
1
- type FetcherOptions<TResponse = any> = {
2
- url: string;
3
- query?: string;
4
- params?: Record<string, string | number | boolean> | null;
5
- payload?: any;
6
- interceptRequest?: (requestOptions: RequestInit & {
7
- url: string;
8
- }) => (RequestInit & {
9
- url: string;
10
- }) | Promise<RequestInit & {
11
- url: string;
12
- }>;
13
- interceptResponse?: (response: TResponse) => TResponse | Promise<TResponse>;
14
- } & RequestInit;
15
- /**
16
- * Experimental fetcher - abstraction layer for query/mutation function creator.
17
- *
18
- * Can be used for REST or GraphQL.
19
- *
20
- * Only work for JSON response only.
21
- *
22
- * @see https://floppy-disk.vercel.app/docs/experimental
23
- *
24
- * @returns A function to fetch data
25
- */
26
- export declare const fetcher: <TResponse = any, TInput extends any[] = any[]>(options: FetcherOptions<TResponse> | ((...args: TInput) => FetcherOptions<TResponse>)) => (...args: TInput) => Promise<TResponse>;
27
- export {};
package/lib/fetcher.js DELETED
@@ -1,99 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.fetcher = void 0;
4
- const utils_1 = require("./utils");
5
- const encodeParams = (params) => Object.entries(params)
6
- .filter(([, value]) => value !== undefined && value !== null)
7
- .map((kv) => kv.map(encodeURIComponent).join('='))
8
- .join('&');
9
- /**
10
- * Experimental fetcher - abstraction layer for query/mutation function creator.
11
- *
12
- * Can be used for REST or GraphQL.
13
- *
14
- * Only work for JSON response only.
15
- *
16
- * @see https://floppy-disk.vercel.app/docs/experimental
17
- *
18
- * @returns A function to fetch data
19
- */
20
- const fetcher = (options) => async (...args) => {
21
- const { url, query, params, payload, headers, interceptRequest = utils_1.identityFn, interceptResponse, ...rest } = (0, utils_1.getValue)(options, ...args);
22
- let autoOptions = {};
23
- let searchParams = params;
24
- if (query) {
25
- // GraphQL
26
- autoOptions = {
27
- method: 'POST',
28
- body: JSON.stringify({ query, variables: payload || args[0] }),
29
- };
30
- }
31
- else if (rest.method && rest.method.toLowerCase() !== 'get') {
32
- // REST - Mutation
33
- autoOptions = {
34
- body: JSON.stringify(payload === undefined ? args[0] : payload),
35
- };
36
- }
37
- else {
38
- // REST - Query
39
- if (typeof options === 'object' && params === undefined)
40
- searchParams = args[0];
41
- }
42
- const interceptedOptions = await interceptRequest({
43
- url: searchParams ? [url, encodeParams(searchParams)].join('?') : url,
44
- headers: { 'Content-Type': 'application/json', ...headers },
45
- ...autoOptions,
46
- ...rest,
47
- });
48
- const { url: finalUrl, ...finalOptions } = interceptedOptions;
49
- const res = await fetch(finalUrl, finalOptions);
50
- const contentType = res.headers.get('content-type');
51
- const isJsonFile = /\.json(\?.+)?$/.test(finalUrl);
52
- if (contentType?.includes('application/json') || isJsonFile) {
53
- let resJson = await res.json();
54
- if (query) {
55
- if (resJson.errors) {
56
- throw (0, utils_1.createError)('Error GraphQL response', {
57
- status: res.status,
58
- statusText: res.statusText,
59
- response: resJson.errors,
60
- request: interceptedOptions,
61
- });
62
- }
63
- resJson = resJson.data;
64
- }
65
- if (res.ok) {
66
- if (interceptResponse) {
67
- try {
68
- const finalResponse = await interceptResponse(resJson);
69
- return finalResponse;
70
- }
71
- catch (error) {
72
- throw (0, utils_1.createError)('Error intercept response', {
73
- status: res.status,
74
- statusText: res.statusText,
75
- response: resJson,
76
- error,
77
- request: interceptedOptions,
78
- });
79
- }
80
- }
81
- return resJson;
82
- }
83
- throw (0, utils_1.createError)('Fetch error', {
84
- status: res.status,
85
- statusText: res.statusText,
86
- response: resJson,
87
- request: interceptedOptions,
88
- });
89
- }
90
- const resText = await res.text().catch(() => undefined);
91
- throw (0, utils_1.createError)('Response type is not a JSON', {
92
- status: res.status,
93
- statusText: res.statusText,
94
- response: resText,
95
- contentType,
96
- request: interceptedOptions,
97
- });
98
- };
99
- exports.fetcher = fetcher;
package/lib/index.js DELETED
@@ -1,11 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- const tslib_1 = require("tslib");
4
- tslib_1.__exportStar(require("./store"), exports);
5
- tslib_1.__exportStar(require("./fetcher"), exports);
6
- tslib_1.__exportStar(require("./react/create-store"), exports);
7
- tslib_1.__exportStar(require("./react/create-stores"), exports);
8
- tslib_1.__exportStar(require("./react/create-query"), exports);
9
- tslib_1.__exportStar(require("./react/create-bi-direction-query"), exports);
10
- tslib_1.__exportStar(require("./react/create-mutation"), exports);
11
- tslib_1.__exportStar(require("./react/with-context"), exports);
@@ -1,166 +0,0 @@
1
- import { Maybe } from '../utils';
2
- import { CreateQueryOptions, QueryState } from './create-query';
3
- import { StoreKey } from './create-stores';
4
- export declare const createBiDirectionQuery: <TKey extends StoreKey = StoreKey, TResponse = any, TData extends any[] = any[], TError = unknown, TPageParam = any>(queryFn: (key: TKey, state: QueryState<TKey, TResponse, TData, TError, TPageParam>, direction: 'prev' | 'next') => Promise<TResponse>, options: Omit<CreateQueryOptions<TKey, TResponse, TData, TError, TPageParam>, "select" | "getNextPageParam"> & {
5
- getPrevPageParam: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
6
- getNextPageParam: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
7
- select: (response: TResponse, state: Pick<QueryState<TKey, TResponse, TData, TError, TPageParam>, "data" | "key">, direction: 'prev' | 'next') => TData;
8
- }) => {
9
- (key: Maybe<TKey>, selectDeps?: "data" | "key" | "error" | "reset" | "status" | "fetch" | "response" | "keyHash" | "forceFetch" | "fetchNextPage" | "optimisticUpdate" | "isWaiting" | "isWaitingNextPage" | "isRefetching" | "isRefetchError" | "isPreviousData" | "isOptimisticData" | "errorUpdatedAt" | "retryCount" | "isGoingToRetry" | "pageParam" | "pageParams" | "hasNextPage" | "retryNextPageCount" | "isGoingToRetryNextPage" | "isLoading" | "isSuccess" | "isError" | "responseUpdatedAt" | import("..").SelectDeps<QueryState<TKey, TResponse, TData, TError, TPageParam>>): {
10
- data: (never[] | TData)[number][];
11
- fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
12
- hasPrevPage: boolean;
13
- isWaitingPrevPage: boolean;
14
- key: TKey;
15
- keyHash: string;
16
- fetch: () => void;
17
- forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
18
- fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
19
- reset: () => void;
20
- optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
21
- revert: () => void;
22
- invalidate: () => void;
23
- };
24
- isWaiting: boolean;
25
- isWaitingNextPage: boolean;
26
- isRefetching: boolean;
27
- isRefetchError: boolean;
28
- isPreviousData: boolean;
29
- isOptimisticData: boolean;
30
- error: TError | undefined;
31
- errorUpdatedAt: number | undefined;
32
- retryCount: number;
33
- isGoingToRetry: boolean;
34
- pageParam: Maybe<TPageParam>;
35
- pageParams: Maybe<TPageParam>[];
36
- hasNextPage: boolean;
37
- retryNextPageCount: number;
38
- isGoingToRetryNextPage: boolean;
39
- status: "loading";
40
- isLoading: true;
41
- isSuccess: false;
42
- isError: false;
43
- response: undefined;
44
- responseUpdatedAt: undefined;
45
- } | {
46
- data: (never[] | TData)[number][];
47
- fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
48
- hasPrevPage: boolean;
49
- isWaitingPrevPage: boolean;
50
- key: TKey;
51
- keyHash: string;
52
- fetch: () => void;
53
- forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
54
- fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
55
- reset: () => void;
56
- optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
57
- revert: () => void;
58
- invalidate: () => void;
59
- };
60
- isWaiting: boolean;
61
- isWaitingNextPage: boolean;
62
- isRefetching: boolean;
63
- isRefetchError: boolean;
64
- isPreviousData: boolean;
65
- isOptimisticData: boolean;
66
- error: TError | undefined;
67
- errorUpdatedAt: number | undefined;
68
- retryCount: number;
69
- isGoingToRetry: boolean;
70
- pageParam: Maybe<TPageParam>;
71
- pageParams: Maybe<TPageParam>[];
72
- hasNextPage: boolean;
73
- retryNextPageCount: number;
74
- isGoingToRetryNextPage: boolean;
75
- status: "error";
76
- isLoading: false;
77
- isSuccess: false;
78
- isError: true;
79
- response: undefined;
80
- responseUpdatedAt: undefined;
81
- } | {
82
- data: (never[] | TData)[number][];
83
- fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
84
- hasPrevPage: boolean;
85
- isWaitingPrevPage: boolean;
86
- key: TKey;
87
- keyHash: string;
88
- fetch: () => void;
89
- forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
90
- fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
91
- reset: () => void;
92
- optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
93
- revert: () => void;
94
- invalidate: () => void;
95
- };
96
- isWaiting: boolean;
97
- isWaitingNextPage: boolean;
98
- isRefetching: boolean;
99
- isRefetchError: boolean;
100
- isPreviousData: boolean;
101
- isOptimisticData: boolean;
102
- error: TError | undefined;
103
- errorUpdatedAt: number | undefined;
104
- retryCount: number;
105
- isGoingToRetry: boolean;
106
- pageParam: Maybe<TPageParam>;
107
- pageParams: Maybe<TPageParam>[];
108
- hasNextPage: boolean;
109
- retryNextPageCount: number;
110
- isGoingToRetryNextPage: boolean;
111
- status: "success";
112
- isLoading: false;
113
- isSuccess: true;
114
- isError: false;
115
- response: TResponse;
116
- responseUpdatedAt: number | undefined;
117
- };
118
- get(): {
119
- prev: QueryState<TKey, TResponse, TData, TError, TPageParam>;
120
- next: QueryState<TKey, TResponse, TData, TError, TPageParam>;
121
- };
122
- setInitialResponse: (options: {
123
- key?: Maybe<TKey>;
124
- response: TResponse;
125
- skipRevalidation?: boolean | undefined;
126
- }) => void;
127
- reset(): void;
128
- resetSpecificKey(key: Maybe<TKey>): void;
129
- invalidate: () => void;
130
- invalidateSpecificKey: (key?: Maybe<TKey>) => void;
131
- suspend: (key?: Maybe<TKey>) => {
132
- key: TKey;
133
- keyHash: string;
134
- fetch: () => void;
135
- forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
136
- fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
137
- reset: () => void;
138
- optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
139
- revert: () => void;
140
- invalidate: () => void;
141
- };
142
- isWaiting: boolean;
143
- isWaitingNextPage: boolean;
144
- isRefetching: boolean;
145
- isRefetchError: boolean;
146
- isPreviousData: boolean;
147
- isOptimisticData: boolean;
148
- error: TError | undefined;
149
- errorUpdatedAt: number | undefined;
150
- retryCount: number;
151
- isGoingToRetry: boolean;
152
- pageParam: Maybe<TPageParam>;
153
- pageParams: Maybe<TPageParam>[];
154
- hasNextPage: boolean;
155
- retryNextPageCount: number;
156
- isGoingToRetryNextPage: boolean;
157
- } & {
158
- status: "success";
159
- isLoading: false;
160
- isSuccess: true;
161
- isError: false;
162
- data: TData;
163
- response: TResponse;
164
- responseUpdatedAt: number | undefined;
165
- };
166
- };
@@ -1,78 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createBiDirectionQuery = void 0;
4
- const utils_1 = require("../utils");
5
- const create_query_1 = require("./create-query");
6
- const createBiDirectionQuery = (queryFn, options) => {
7
- const { getPrevPageParam, getNextPageParam, select, ...restOptions } = options;
8
- const usePrevPagesQuery = (0, create_query_1.createQuery)((key, state) => queryFn(key, state, 'prev'), {
9
- defaultDeps: (state) => [
10
- state.isWaiting,
11
- state.data,
12
- state.error,
13
- state.isWaitingNextPage,
14
- state.hasNextPage,
15
- ],
16
- fetchOnMount: false,
17
- getNextPageParam: getPrevPageParam,
18
- select: (response, state) => select(response, state, 'prev'),
19
- ...restOptions,
20
- });
21
- const useNextPagesQuery = (0, create_query_1.createQuery)(async (key, state) => {
22
- const isInitialPage = state.pageParam === undefined;
23
- const pQuery = usePrevPagesQuery.get(key);
24
- try {
25
- const response = await queryFn(key, state, 'next');
26
- if (isInitialPage) {
27
- const prevPageParam = getPrevPageParam(response, 1, pQuery);
28
- usePrevPagesQuery.set(key, (prev) => ({
29
- pageParams: [prevPageParam, ...prev.pageParams.slice(1)],
30
- hasNextPage: prev.isLoading ? (0, utils_1.hasValue)(prevPageParam) : prev.hasNextPage,
31
- }));
32
- if (!pQuery.isLoading)
33
- pQuery.forceFetch();
34
- }
35
- return response;
36
- }
37
- catch (error) {
38
- if (isInitialPage && !pQuery.isLoading)
39
- pQuery.reset();
40
- throw error;
41
- }
42
- }, {
43
- getNextPageParam: getNextPageParam,
44
- select: (response, state) => select(response, state, 'next'),
45
- ...restOptions,
46
- });
47
- const useBiDirectionQuery = (...args) => {
48
- const pQuery = usePrevPagesQuery(...args);
49
- const nQuery = useNextPagesQuery(...args);
50
- return {
51
- ...nQuery,
52
- data: [...(pQuery.data || []), ...(nQuery.data || [])],
53
- fetchPrevPage: pQuery.fetchNextPage,
54
- hasPrevPage: pQuery.hasNextPage,
55
- isWaitingPrevPage: pQuery.isWaitingNextPage || (pQuery.isLoading && pQuery.isWaiting),
56
- };
57
- };
58
- useBiDirectionQuery.get = () => {
59
- return {
60
- prev: usePrevPagesQuery.get(),
61
- next: useNextPagesQuery.get(),
62
- };
63
- };
64
- useBiDirectionQuery.setInitialResponse = useNextPagesQuery.setInitialResponse;
65
- useBiDirectionQuery.reset = () => {
66
- usePrevPagesQuery.reset();
67
- useNextPagesQuery.reset();
68
- };
69
- useBiDirectionQuery.resetSpecificKey = (key) => {
70
- usePrevPagesQuery.resetSpecificKey(key);
71
- useNextPagesQuery.resetSpecificKey(key);
72
- };
73
- useBiDirectionQuery.invalidate = useNextPagesQuery.invalidate;
74
- useBiDirectionQuery.invalidateSpecificKey = useNextPagesQuery.invalidateSpecificKey;
75
- useBiDirectionQuery.suspend = useNextPagesQuery.suspend;
76
- return useBiDirectionQuery;
77
- };
78
- exports.createBiDirectionQuery = createBiDirectionQuery;