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
package/vanilla.js ADDED
@@ -0,0 +1,118 @@
1
+ 'use strict';
2
+
3
+ const isClient = typeof window !== "undefined" && !("Deno" in window);
4
+ const noop = () => {
5
+ };
6
+ const identity = (value) => value;
7
+ const getValue = (valueOrComputeValueFn, ...params) => {
8
+ if (typeof valueOrComputeValueFn === "function") {
9
+ return valueOrComputeValueFn(...params);
10
+ }
11
+ return valueOrComputeValueFn;
12
+ };
13
+
14
+ const shallow = (a, b) => {
15
+ if (Object.is(a, b)) {
16
+ return true;
17
+ }
18
+ if (typeof a !== "object" || a === null || typeof b !== "object" || b === null) {
19
+ return false;
20
+ }
21
+ if (a instanceof Map && b instanceof Map) {
22
+ if (a.size !== b.size) return false;
23
+ for (const [key, value] of a) {
24
+ if (!Object.is(value, b.get(key))) {
25
+ return false;
26
+ }
27
+ }
28
+ return true;
29
+ }
30
+ if (a instanceof Set && b instanceof Set) {
31
+ if (a.size !== b.size) return false;
32
+ for (const value of a) {
33
+ if (!b.has(value)) return false;
34
+ }
35
+ return true;
36
+ }
37
+ const keysA = Object.keys(a);
38
+ if (keysA.length !== Object.keys(b).length) {
39
+ return false;
40
+ }
41
+ for (let i = 0; i < keysA.length; i++) {
42
+ if (!Object.prototype.hasOwnProperty.call(b, keysA[i]) || !Object.is(a[keysA[i]], b[keysA[i]])) {
43
+ return false;
44
+ }
45
+ }
46
+ return true;
47
+ };
48
+
49
+ const hasObjectPrototype = (value) => {
50
+ return Object.prototype.toString.call(value) === "[object Object]";
51
+ };
52
+ const isPlainObject = (value) => {
53
+ if (!hasObjectPrototype(value)) return false;
54
+ const ctor = value.constructor;
55
+ if (typeof ctor === "undefined") return true;
56
+ const prot = ctor.prototype;
57
+ if (!hasObjectPrototype(prot)) return false;
58
+ if (!prot.hasOwnProperty("isPrototypeOf")) return false;
59
+ if (Object.getPrototypeOf(value) !== Object.prototype) return false;
60
+ return true;
61
+ };
62
+ const getHash = (value) => JSON.stringify(
63
+ value,
64
+ (_, val) => isPlainObject(val) ? Object.keys(val).sort().reduce((result, key) => {
65
+ result[key] = val[key];
66
+ return result;
67
+ }, {}) : val
68
+ );
69
+
70
+ const initStore = (initialState, options = {}) => {
71
+ const {
72
+ onFirstSubscribe = noop,
73
+ onSubscribe = noop,
74
+ onUnsubscribe = noop,
75
+ onLastUnsubscribe = noop
76
+ } = options;
77
+ const subscribers = /* @__PURE__ */ new Set();
78
+ const getSubscribers = () => subscribers;
79
+ const subscribe = (subscriber) => {
80
+ subscribers.add(subscriber);
81
+ if (subscribers.size === 1) onFirstSubscribe(state, storeApi);
82
+ onSubscribe(state, storeApi);
83
+ return () => {
84
+ subscribers.delete(subscriber);
85
+ onUnsubscribe(state, storeApi);
86
+ if (subscribers.size === 0) onLastUnsubscribe(state, storeApi);
87
+ };
88
+ };
89
+ let state = initialState;
90
+ const getState = () => state;
91
+ const setState = (value) => {
92
+ const prevState = state;
93
+ const newValue = getValue(value, state);
94
+ for (const key in newValue) {
95
+ if (!Object.is(prevState[key], newValue[key])) {
96
+ state = { ...prevState, ...newValue };
97
+ [...subscribers].forEach((subscriber) => subscriber(state, prevState));
98
+ return;
99
+ }
100
+ }
101
+ };
102
+ const storeApi = {
103
+ getState,
104
+ setState,
105
+ subscribe,
106
+ getSubscribers
107
+ };
108
+ return storeApi;
109
+ };
110
+
111
+ exports.getHash = getHash;
112
+ exports.getValue = getValue;
113
+ exports.identity = identity;
114
+ exports.initStore = initStore;
115
+ exports.isClient = isClient;
116
+ exports.isPlainObject = isPlainObject;
117
+ exports.noop = noop;
118
+ exports.shallow = shallow;
package/esm/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/esm/fetcher.js DELETED
@@ -1,95 +0,0 @@
1
- import { createError, getValue, identityFn } from './utils';
2
- const encodeParams = (params) => Object.entries(params)
3
- .filter(([, value]) => value !== undefined && value !== null)
4
- .map((kv) => kv.map(encodeURIComponent).join('='))
5
- .join('&');
6
- /**
7
- * Experimental fetcher - abstraction layer for query/mutation function creator.
8
- *
9
- * Can be used for REST or GraphQL.
10
- *
11
- * Only work for JSON response only.
12
- *
13
- * @see https://floppy-disk.vercel.app/docs/experimental
14
- *
15
- * @returns A function to fetch data
16
- */
17
- export const fetcher = (options) => async (...args) => {
18
- const { url, query, params, payload, headers, interceptRequest = identityFn, interceptResponse, ...rest } = getValue(options, ...args);
19
- let autoOptions = {};
20
- let searchParams = params;
21
- if (query) {
22
- // GraphQL
23
- autoOptions = {
24
- method: 'POST',
25
- body: JSON.stringify({ query, variables: payload || args[0] }),
26
- };
27
- }
28
- else if (rest.method && rest.method.toLowerCase() !== 'get') {
29
- // REST - Mutation
30
- autoOptions = {
31
- body: JSON.stringify(payload === undefined ? args[0] : payload),
32
- };
33
- }
34
- else {
35
- // REST - Query
36
- if (typeof options === 'object' && params === undefined)
37
- searchParams = args[0];
38
- }
39
- const interceptedOptions = await interceptRequest({
40
- url: searchParams ? [url, encodeParams(searchParams)].join('?') : url,
41
- headers: { 'Content-Type': 'application/json', ...headers },
42
- ...autoOptions,
43
- ...rest,
44
- });
45
- const { url: finalUrl, ...finalOptions } = interceptedOptions;
46
- const res = await fetch(finalUrl, finalOptions);
47
- const contentType = res.headers.get('content-type');
48
- const isJsonFile = /\.json(\?.+)?$/.test(finalUrl);
49
- if (contentType?.includes('application/json') || isJsonFile) {
50
- let resJson = await res.json();
51
- if (query) {
52
- if (resJson.errors) {
53
- throw createError('Error GraphQL response', {
54
- status: res.status,
55
- statusText: res.statusText,
56
- response: resJson.errors,
57
- request: interceptedOptions,
58
- });
59
- }
60
- resJson = resJson.data;
61
- }
62
- if (res.ok) {
63
- if (interceptResponse) {
64
- try {
65
- const finalResponse = await interceptResponse(resJson);
66
- return finalResponse;
67
- }
68
- catch (error) {
69
- throw createError('Error intercept response', {
70
- status: res.status,
71
- statusText: res.statusText,
72
- response: resJson,
73
- error,
74
- request: interceptedOptions,
75
- });
76
- }
77
- }
78
- return resJson;
79
- }
80
- throw createError('Fetch error', {
81
- status: res.status,
82
- statusText: res.statusText,
83
- response: resJson,
84
- request: interceptedOptions,
85
- });
86
- }
87
- const resText = await res.text().catch(() => undefined);
88
- throw createError('Response type is not a JSON', {
89
- status: res.status,
90
- statusText: res.statusText,
91
- response: resText,
92
- contentType,
93
- request: interceptedOptions,
94
- });
95
- };
package/esm/index.d.ts DELETED
@@ -1,8 +0,0 @@
1
- export * from './store';
2
- export * from './fetcher';
3
- export * from './react/create-store';
4
- export * from './react/create-stores';
5
- export * from './react/create-query';
6
- export * from './react/create-bi-direction-query';
7
- export * from './react/create-mutation';
8
- export * from './react/with-context';
package/esm/index.js DELETED
@@ -1,8 +0,0 @@
1
- export * from './store';
2
- export * from './fetcher';
3
- export * from './react/create-store';
4
- export * from './react/create-stores';
5
- export * from './react/create-query';
6
- export * from './react/create-bi-direction-query';
7
- export * from './react/create-mutation';
8
- export * from './react/with-context';
@@ -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,74 +0,0 @@
1
- import { hasValue } from '../utils';
2
- import { createQuery } from './create-query';
3
- export const createBiDirectionQuery = (queryFn, options) => {
4
- const { getPrevPageParam, getNextPageParam, select, ...restOptions } = options;
5
- const usePrevPagesQuery = createQuery((key, state) => queryFn(key, state, 'prev'), {
6
- defaultDeps: (state) => [
7
- state.isWaiting,
8
- state.data,
9
- state.error,
10
- state.isWaitingNextPage,
11
- state.hasNextPage,
12
- ],
13
- fetchOnMount: false,
14
- getNextPageParam: getPrevPageParam,
15
- select: (response, state) => select(response, state, 'prev'),
16
- ...restOptions,
17
- });
18
- const useNextPagesQuery = createQuery(async (key, state) => {
19
- const isInitialPage = state.pageParam === undefined;
20
- const pQuery = usePrevPagesQuery.get(key);
21
- try {
22
- const response = await queryFn(key, state, 'next');
23
- if (isInitialPage) {
24
- const prevPageParam = getPrevPageParam(response, 1, pQuery);
25
- usePrevPagesQuery.set(key, (prev) => ({
26
- pageParams: [prevPageParam, ...prev.pageParams.slice(1)],
27
- hasNextPage: prev.isLoading ? hasValue(prevPageParam) : prev.hasNextPage,
28
- }));
29
- if (!pQuery.isLoading)
30
- pQuery.forceFetch();
31
- }
32
- return response;
33
- }
34
- catch (error) {
35
- if (isInitialPage && !pQuery.isLoading)
36
- pQuery.reset();
37
- throw error;
38
- }
39
- }, {
40
- getNextPageParam: getNextPageParam,
41
- select: (response, state) => select(response, state, 'next'),
42
- ...restOptions,
43
- });
44
- const useBiDirectionQuery = (...args) => {
45
- const pQuery = usePrevPagesQuery(...args);
46
- const nQuery = useNextPagesQuery(...args);
47
- return {
48
- ...nQuery,
49
- data: [...(pQuery.data || []), ...(nQuery.data || [])],
50
- fetchPrevPage: pQuery.fetchNextPage,
51
- hasPrevPage: pQuery.hasNextPage,
52
- isWaitingPrevPage: pQuery.isWaitingNextPage || (pQuery.isLoading && pQuery.isWaiting),
53
- };
54
- };
55
- useBiDirectionQuery.get = () => {
56
- return {
57
- prev: usePrevPagesQuery.get(),
58
- next: useNextPagesQuery.get(),
59
- };
60
- };
61
- useBiDirectionQuery.setInitialResponse = useNextPagesQuery.setInitialResponse;
62
- useBiDirectionQuery.reset = () => {
63
- usePrevPagesQuery.reset();
64
- useNextPagesQuery.reset();
65
- };
66
- useBiDirectionQuery.resetSpecificKey = (key) => {
67
- usePrevPagesQuery.resetSpecificKey(key);
68
- useNextPagesQuery.resetSpecificKey(key);
69
- };
70
- useBiDirectionQuery.invalidate = useNextPagesQuery.invalidate;
71
- useBiDirectionQuery.invalidateSpecificKey = useNextPagesQuery.invalidateSpecificKey;
72
- useBiDirectionQuery.suspend = useNextPagesQuery.suspend;
73
- return useBiDirectionQuery;
74
- };
@@ -1,39 +0,0 @@
1
- import { InitStoreOptions } from '../store';
2
- import { UseStore } from './create-store';
3
- export type MutationState<TVar, TResponse = any, TError = unknown> = {
4
- /**
5
- * Network fetching status.
6
- */
7
- isWaiting: boolean;
8
- isSuccess: boolean;
9
- isError: boolean;
10
- response: TResponse | undefined;
11
- responseUpdatedAt: number | undefined;
12
- error: TError | undefined;
13
- errorUpdatedAt: number | undefined;
14
- /**
15
- * Mutate function.
16
- *
17
- * @returns Promise that will always get resolved.
18
- */
19
- mutate: TVar extends undefined ? () => Promise<{
20
- response?: TResponse;
21
- error?: TError;
22
- variables?: TVar;
23
- }> : (variables: TVar) => Promise<{
24
- response?: TResponse;
25
- error?: TError;
26
- variables?: TVar;
27
- }>;
28
- };
29
- export type UseMutation<TVar, TResponse = any, TError = unknown> = UseStore<MutationState<TVar, TResponse, TError>>;
30
- export type CreateMutationOptions<TVar, TResponse = any, TError = unknown> = InitStoreOptions<MutationState<TVar, TResponse, TError>> & {
31
- onMutate?: (variables: TVar, stateBeforeMutate: MutationState<TVar, TResponse, TError>) => void;
32
- onSuccess?: (response: TResponse, variables: TVar, stateBeforeMutate: MutationState<TVar, TResponse, TError>) => void;
33
- onError?: (error: TError, variables: TVar, stateBeforeMutate: MutationState<TVar, TResponse, TError>) => void;
34
- onSettled?: (variables: TVar, stateBeforeMutate: MutationState<TVar, TResponse, TError>) => void;
35
- };
36
- /**
37
- * @see https://floppy-disk.vercel.app/docs/api#createmutation
38
- */
39
- export declare const createMutation: <TVar, TResponse = any, TError = unknown>(mutationFn: (variables: TVar, state: MutationState<TVar, TResponse, TError>) => Promise<TResponse>, options?: CreateMutationOptions<TVar, TResponse, TError>) => UseMutation<TVar, TResponse, TError>;
@@ -1,56 +0,0 @@
1
- import { noop } from '../utils';
2
- import { createStore } from './create-store';
3
- /**
4
- * @see https://floppy-disk.vercel.app/docs/api#createmutation
5
- */
6
- export const createMutation = (mutationFn, options = {}) => {
7
- const { onMutate = noop, onSuccess = noop, onError, onSettled = noop, ...createStoreOptions } = options;
8
- const useMutation = createStore(({ set, get }) => ({
9
- isWaiting: false,
10
- isSuccess: false,
11
- isError: false,
12
- response: undefined,
13
- responseUpdatedAt: undefined,
14
- error: undefined,
15
- errorUpdatedAt: undefined,
16
- mutate: ((variables) => {
17
- set({ isWaiting: true });
18
- const stateBeforeMutate = get();
19
- onMutate(variables, stateBeforeMutate);
20
- return new Promise((resolve) => {
21
- mutationFn(variables, stateBeforeMutate)
22
- .then((response) => {
23
- set({
24
- isWaiting: false,
25
- isSuccess: true,
26
- isError: false,
27
- response,
28
- responseUpdatedAt: Date.now(),
29
- error: undefined,
30
- errorUpdatedAt: undefined,
31
- });
32
- onSuccess(response, variables, stateBeforeMutate);
33
- resolve({ response, variables });
34
- })
35
- .catch((error) => {
36
- set({
37
- isWaiting: false,
38
- isSuccess: false,
39
- isError: true,
40
- error,
41
- errorUpdatedAt: Date.now(),
42
- });
43
- if (onError)
44
- onError(error, variables, stateBeforeMutate);
45
- else
46
- console.error(error, variables, get());
47
- resolve({ error, variables });
48
- })
49
- .finally(() => {
50
- onSettled(variables, stateBeforeMutate);
51
- });
52
- });
53
- }),
54
- }), createStoreOptions);
55
- return useMutation;
56
- };