floppy-disk 2.7.3-beta.1 → 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.
@@ -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;
@@ -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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "floppy-disk",
3
- "version": "2.7.3-beta.1",
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
- };