floppy-disk 2.7.2 → 2.8.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.
@@ -239,6 +239,8 @@ export const createQuery = (queryFn, options = {}) => {
239
239
  fetchNextPage,
240
240
  reset: () => {
241
241
  preventReplaceResponse.set(keyHash, true);
242
+ clearTimeout(retryTimeoutId.get(keyHash));
243
+ clearTimeout(retryNextPageTimeoutId.get(keyHash));
242
244
  set(INITIAL_QUERY_STATE);
243
245
  },
244
246
  optimisticUpdate: (response) => useQuery.optimisticUpdate({ key, response }),
@@ -356,6 +358,8 @@ export const createQuery = (queryFn, options = {}) => {
356
358
  useQuery.reset = () => {
357
359
  useQuery.getStores().forEach((store, keyHash) => {
358
360
  preventReplaceResponse.set(keyHash, true);
361
+ clearTimeout(retryTimeoutId.get(keyHash));
362
+ clearTimeout(retryNextPageTimeoutId.get(keyHash));
359
363
  store.set(INITIAL_QUERY_STATE);
360
364
  });
361
365
  };
@@ -70,7 +70,7 @@ export const createStores = (initializer, options = {}) => {
70
70
  store.set(value, silent);
71
71
  });
72
72
  };
73
- useStores.subscribe = (key, fn, selectDeps) => {
73
+ useStores.subscribe = (key, fn, selectDeps = defaultDeps) => {
74
74
  const store = getStore(key);
75
75
  return store.subscribe(fn, selectDeps);
76
76
  };
package/esm/vanilla.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type StoreData = Record<string, any>;
2
2
  export type SetStoreData<T> = Partial<T> | ((prevState: T) => Partial<T>);
3
- export type SelectDeps<T> = ((state: T) => any[]) | undefined;
3
+ export type SelectDeps<T> = ((state: T) => any[]) | undefined | null;
4
4
  export type Subscribers<T> = Map<(state: T) => void, SelectDeps<T>>;
5
5
  export type StoreInitializer<T> = (api: {
6
6
  get: () => T;
package/esm/vanilla.js CHANGED
@@ -1,4 +1,4 @@
1
- import { noop } from './utils';
1
+ import { getValueOrComputedValue, noop } from './utils';
2
2
  export const initStore = (initializer, options = {}) => {
3
3
  const { intercept, onFirstSubscribe = noop, onSubscribe = noop, onUnsubscribe = noop, onLastUnsubscribe = noop, } = options;
4
4
  const subscribers = new Map();
@@ -7,12 +7,7 @@ export const initStore = (initializer, options = {}) => {
7
7
  const get = () => data;
8
8
  const set = (value, silent = false) => {
9
9
  const prevData = data;
10
- if (typeof value === 'function') {
11
- data = { ...data, ...value(data) };
12
- }
13
- else {
14
- data = { ...data, ...value };
15
- }
10
+ data = { ...data, ...getValueOrComputedValue(value, data) };
16
11
  if (intercept) {
17
12
  data = { ...data, ...intercept(data, prevData) };
18
13
  }
@@ -242,6 +242,8 @@ const createQuery = (queryFn, options = {}) => {
242
242
  fetchNextPage,
243
243
  reset: () => {
244
244
  preventReplaceResponse.set(keyHash, true);
245
+ clearTimeout(retryTimeoutId.get(keyHash));
246
+ clearTimeout(retryNextPageTimeoutId.get(keyHash));
245
247
  set(INITIAL_QUERY_STATE);
246
248
  },
247
249
  optimisticUpdate: (response) => useQuery.optimisticUpdate({ key, response }),
@@ -359,6 +361,8 @@ const createQuery = (queryFn, options = {}) => {
359
361
  useQuery.reset = () => {
360
362
  useQuery.getStores().forEach((store, keyHash) => {
361
363
  preventReplaceResponse.set(keyHash, true);
364
+ clearTimeout(retryTimeoutId.get(keyHash));
365
+ clearTimeout(retryNextPageTimeoutId.get(keyHash));
362
366
  store.set(INITIAL_QUERY_STATE);
363
367
  });
364
368
  };
@@ -73,7 +73,7 @@ const createStores = (initializer, options = {}) => {
73
73
  store.set(value, silent);
74
74
  });
75
75
  };
76
- useStores.subscribe = (key, fn, selectDeps) => {
76
+ useStores.subscribe = (key, fn, selectDeps = defaultDeps) => {
77
77
  const store = getStore(key);
78
78
  return store.subscribe(fn, selectDeps);
79
79
  };
package/lib/vanilla.d.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export type StoreData = Record<string, any>;
2
2
  export type SetStoreData<T> = Partial<T> | ((prevState: T) => Partial<T>);
3
- export type SelectDeps<T> = ((state: T) => any[]) | undefined;
3
+ export type SelectDeps<T> = ((state: T) => any[]) | undefined | null;
4
4
  export type Subscribers<T> = Map<(state: T) => void, SelectDeps<T>>;
5
5
  export type StoreInitializer<T> = (api: {
6
6
  get: () => T;
package/lib/vanilla.js CHANGED
@@ -10,12 +10,7 @@ const initStore = (initializer, options = {}) => {
10
10
  const get = () => data;
11
11
  const set = (value, silent = false) => {
12
12
  const prevData = data;
13
- if (typeof value === 'function') {
14
- data = { ...data, ...value(data) };
15
- }
16
- else {
17
- data = { ...data, ...value };
18
- }
13
+ data = { ...data, ...(0, utils_1.getValueOrComputedValue)(value, data) };
19
14
  if (intercept) {
20
15
  data = { ...data, ...intercept(data, prevData) };
21
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "floppy-disk",
3
- "version": "2.7.2",
3
+ "version": "2.8.0-beta.1",
4
4
  "description": "FloppyDisk - lightweight, simple, and powerful state management library",
5
5
  "keywords": [
6
6
  "state",
@@ -56,7 +56,7 @@
56
56
  "prepare": "husky install",
57
57
  "build:cjs": "tsc -p tsconfig.prod.json",
58
58
  "build:es": "tsc -p tsconfig.prod.json -m esNext --outDir esm",
59
- "build": "yarn clean && yarn build:cjs && yarn build:es",
59
+ "build": "pnpm clean && pnpm build:cjs && pnpm build:es",
60
60
  "prebuild": "ts-node ./scripts/preact.ts",
61
61
  "clean": "rimraf lib esm",
62
62
  "format": "prettier --check .",
@@ -64,7 +64,7 @@
64
64
  "lint": "eslint .",
65
65
  "lint:fix": "eslint . --fix",
66
66
  "lint:types": "tsc --noEmit",
67
- "test": "jest",
67
+ "test": "jest --silent",
68
68
  "semantic-release": "semantic-release"
69
69
  },
70
70
  "release": {
@@ -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
- };