floppy-disk 2.11.1-experimental.2 → 2.12.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -297,3 +297,14 @@ export type UseQuery<TKey extends StoreKey = StoreKey, TResponse = any, TData =
297
297
  * @see https://floppy-disk.vercel.app/docs/api#createquery
298
298
  */
299
299
  export declare const createQuery: <TKey extends StoreKey = StoreKey, TResponse = any, TData = TResponse, TError = unknown, TPageParam = any>(queryFn: (key: TKey, state: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Promise<TResponse>, options?: CreateQueryOptions<TKey, TResponse, TData, TError, TPageParam>) => UseQuery<TKey, TResponse, TData, TError, TPageParam>;
300
+ export type ExtractQueryState<T extends UseQuery<any, any, any, any, any>> = {
301
+ loading: Extract<ReturnType<T['get']>, {
302
+ status: 'loading';
303
+ }>;
304
+ success: Extract<ReturnType<T['get']>, {
305
+ status: 'success';
306
+ }>;
307
+ error: Extract<ReturnType<T['get']>, {
308
+ status: 'error';
309
+ }>;
310
+ };
@@ -176,7 +176,7 @@ export const createQuery = (queryFn, options = {}) => {
176
176
  });
177
177
  const fetch = () => {
178
178
  const { responseUpdatedAt } = get();
179
- const isStale = Date.now() > (responseUpdatedAt || 0) + staleTime;
179
+ const isStale = !responseUpdatedAt || Date.now() > responseUpdatedAt + staleTime;
180
180
  if (!isStale)
181
181
  return;
182
182
  forceFetch();
@@ -297,3 +297,14 @@ export type UseQuery<TKey extends StoreKey = StoreKey, TResponse = any, TData =
297
297
  * @see https://floppy-disk.vercel.app/docs/api#createquery
298
298
  */
299
299
  export declare const createQuery: <TKey extends StoreKey = StoreKey, TResponse = any, TData = TResponse, TError = unknown, TPageParam = any>(queryFn: (key: TKey, state: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Promise<TResponse>, options?: CreateQueryOptions<TKey, TResponse, TData, TError, TPageParam>) => UseQuery<TKey, TResponse, TData, TError, TPageParam>;
300
+ export type ExtractQueryState<T extends UseQuery<any, any, any, any, any>> = {
301
+ loading: Extract<ReturnType<T['get']>, {
302
+ status: 'loading';
303
+ }>;
304
+ success: Extract<ReturnType<T['get']>, {
305
+ status: 'success';
306
+ }>;
307
+ error: Extract<ReturnType<T['get']>, {
308
+ status: 'error';
309
+ }>;
310
+ };
@@ -179,7 +179,7 @@ const createQuery = (queryFn, options = {}) => {
179
179
  });
180
180
  const fetch = () => {
181
181
  const { responseUpdatedAt } = get();
182
- const isStale = Date.now() > (responseUpdatedAt || 0) + staleTime;
182
+ const isStale = !responseUpdatedAt || Date.now() > responseUpdatedAt + staleTime;
183
183
  if (!isStale)
184
184
  return;
185
185
  forceFetch();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "floppy-disk",
3
- "version": "2.11.1-experimental.2",
3
+ "version": "2.12.0-beta.1",
4
4
  "description": "FloppyDisk - lightweight, simple, and powerful state management library",
5
5
  "keywords": [
6
6
  "state",
@@ -41,15 +41,6 @@
41
41
  },
42
42
  "module": "./esm/index.js",
43
43
  "default": "./lib/index.js"
44
- },
45
- "./preact": {
46
- "types": "./lib/preact/index.d.ts",
47
- "import": {
48
- "types": "./esm/preact/index.d.ts",
49
- "default": "./esm/preact/index.js"
50
- },
51
- "module": "./esm/preact/index.js",
52
- "default": "./lib/preact/index.js"
53
44
  }
54
45
  },
55
46
  "scripts": {
@@ -1,167 +0,0 @@
1
- import { Maybe } from '../utils';
2
- import { SelectDeps } from '../vanilla';
3
- import { CreateQueryOptions, QueryState } from './create-query';
4
- import { StoreKey } from './create-stores';
5
- 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"> & {
6
- getPrevPageParam: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
7
- getNextPageParam: (lastPage: TResponse, index: number, stateBeforeCallQuery: QueryState<TKey, TResponse, TData, TError, TPageParam>) => Maybe<TPageParam>;
8
- select: (response: TResponse, state: Pick<QueryState<TKey, TResponse, TData, TError, TPageParam>, "data" | "key">, direction: 'prev' | 'next') => TData;
9
- }) => {
10
- (...args: [Maybe<TKey>, SelectDeps<QueryState<TKey, TResponse, TData, TError, TPageParam>>?] | [SelectDeps<QueryState<TKey, TResponse, TData, TError, TPageParam>>?]): {
11
- data: (never[] | TData)[number][];
12
- fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
13
- hasPrevPage: boolean;
14
- isWaitingPrevPage: boolean;
15
- key: TKey;
16
- keyHash: string;
17
- fetch: () => void;
18
- forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
19
- fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
20
- reset: () => void;
21
- optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
22
- revert: () => void;
23
- invalidate: () => void;
24
- };
25
- isWaiting: boolean;
26
- isWaitingNextPage: boolean;
27
- isRefetching: boolean;
28
- isRefetchError: boolean;
29
- isPreviousData: boolean;
30
- isOptimisticData: boolean;
31
- error: TError | undefined;
32
- errorUpdatedAt: number | undefined;
33
- retryCount: number;
34
- isGoingToRetry: boolean;
35
- pageParam: Maybe<TPageParam>;
36
- pageParams: Maybe<TPageParam>[];
37
- hasNextPage: boolean;
38
- retryNextPageCount: number;
39
- isGoingToRetryNextPage: boolean;
40
- status: "loading";
41
- isLoading: true;
42
- isSuccess: false;
43
- isError: false;
44
- response: undefined;
45
- responseUpdatedAt: undefined;
46
- } | {
47
- data: (never[] | TData)[number][];
48
- fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
49
- hasPrevPage: boolean;
50
- isWaitingPrevPage: boolean;
51
- key: TKey;
52
- keyHash: string;
53
- fetch: () => void;
54
- forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
55
- fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
56
- reset: () => void;
57
- optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
58
- revert: () => void;
59
- invalidate: () => void;
60
- };
61
- isWaiting: boolean;
62
- isWaitingNextPage: boolean;
63
- isRefetching: boolean;
64
- isRefetchError: boolean;
65
- isPreviousData: boolean;
66
- isOptimisticData: boolean;
67
- error: TError | undefined;
68
- errorUpdatedAt: number | undefined;
69
- retryCount: number;
70
- isGoingToRetry: boolean;
71
- pageParam: Maybe<TPageParam>;
72
- pageParams: Maybe<TPageParam>[];
73
- hasNextPage: boolean;
74
- retryNextPageCount: number;
75
- isGoingToRetryNextPage: boolean;
76
- status: "error";
77
- isLoading: false;
78
- isSuccess: false;
79
- isError: true;
80
- response: undefined;
81
- responseUpdatedAt: undefined;
82
- } | {
83
- data: (never[] | TData)[number][];
84
- fetchPrevPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
85
- hasPrevPage: boolean;
86
- isWaitingPrevPage: boolean;
87
- key: TKey;
88
- keyHash: string;
89
- fetch: () => void;
90
- forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
91
- fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
92
- reset: () => void;
93
- optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
94
- revert: () => void;
95
- invalidate: () => void;
96
- };
97
- isWaiting: boolean;
98
- isWaitingNextPage: boolean;
99
- isRefetching: boolean;
100
- isRefetchError: boolean;
101
- isPreviousData: boolean;
102
- isOptimisticData: boolean;
103
- error: TError | undefined;
104
- errorUpdatedAt: number | undefined;
105
- retryCount: number;
106
- isGoingToRetry: boolean;
107
- pageParam: Maybe<TPageParam>;
108
- pageParams: Maybe<TPageParam>[];
109
- hasNextPage: boolean;
110
- retryNextPageCount: number;
111
- isGoingToRetryNextPage: boolean;
112
- status: "success";
113
- isLoading: false;
114
- isSuccess: true;
115
- isError: false;
116
- response: TResponse;
117
- responseUpdatedAt: number | undefined;
118
- };
119
- get(): {
120
- prev: QueryState<TKey, TResponse, TData, TError, TPageParam>;
121
- next: QueryState<TKey, TResponse, TData, TError, TPageParam>;
122
- };
123
- setInitialResponse: (options: {
124
- key?: Maybe<TKey>;
125
- response: TResponse;
126
- skipRevalidation?: boolean | undefined;
127
- }) => void;
128
- reset(): void;
129
- resetSpecificKey(key: Maybe<TKey>): void;
130
- invalidate: () => void;
131
- invalidateSpecificKey: (key?: Maybe<TKey>) => void;
132
- suspend: (key?: Maybe<TKey>) => {
133
- key: TKey;
134
- keyHash: string;
135
- fetch: () => void;
136
- forceFetch: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
137
- fetchNextPage: () => Promise<QueryState<TKey, TResponse, TData, TError, TPageParam>>;
138
- reset: () => void;
139
- optimisticUpdate: (response: TResponse | ((prevState: QueryState<TKey, TResponse, TData, TError, TPageParam>) => TResponse)) => {
140
- revert: () => void;
141
- invalidate: () => void;
142
- };
143
- isWaiting: boolean;
144
- isWaitingNextPage: boolean;
145
- isRefetching: boolean;
146
- isRefetchError: boolean;
147
- isPreviousData: boolean;
148
- isOptimisticData: boolean;
149
- error: TError | undefined;
150
- errorUpdatedAt: number | undefined;
151
- retryCount: number;
152
- isGoingToRetry: boolean;
153
- pageParam: Maybe<TPageParam>;
154
- pageParams: Maybe<TPageParam>[];
155
- hasNextPage: boolean;
156
- retryNextPageCount: number;
157
- isGoingToRetryNextPage: boolean;
158
- } & {
159
- status: "success";
160
- isLoading: false;
161
- isSuccess: true;
162
- isError: false;
163
- data: TData;
164
- response: TResponse;
165
- responseUpdatedAt: number | undefined;
166
- };
167
- };
@@ -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 '../vanilla';
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,53 +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 = noop, 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
- onError(error, variables, stateBeforeMutate);
44
- resolve({ error, variables });
45
- })
46
- .finally(() => {
47
- onSettled(variables, stateBeforeMutate);
48
- });
49
- });
50
- }),
51
- }), createStoreOptions);
52
- return useMutation;
53
- };