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.
- package/README.md +0 -835
- package/esm/index.d.mts +1 -0
- package/esm/index.mjs +1 -0
- package/esm/react/create-mutation.d.mts +135 -0
- package/esm/react/create-query.d.mts +319 -0
- package/esm/react/create-store.d.mts +25 -0
- package/esm/react/create-stores.d.mts +32 -0
- package/esm/react/use-isomorphic-layout-effect.d.mts +6 -0
- package/esm/react/use-store.d.mts +18 -0
- package/esm/react.d.mts +6 -0
- package/esm/react.mjs +503 -0
- package/esm/vanilla/basic.d.mts +21 -0
- package/esm/vanilla/hash.d.mts +7 -0
- package/esm/vanilla/shallow.d.mts +6 -0
- package/esm/vanilla/store.d.mts +75 -0
- package/esm/vanilla.d.mts +4 -0
- package/esm/vanilla.mjs +109 -0
- package/index.d.ts +1 -0
- package/index.js +12 -0
- package/package.json +50 -45
- package/react/create-mutation.d.ts +135 -0
- package/react/create-query.d.ts +319 -0
- package/react/create-store.d.ts +25 -0
- package/react/create-stores.d.ts +32 -0
- package/react/use-isomorphic-layout-effect.d.ts +6 -0
- package/react/use-store.d.ts +18 -0
- package/{lib/index.d.ts → react.d.ts} +2 -4
- package/react.js +511 -0
- package/ts_version_4.5_and_above_is_required.d.ts +0 -0
- package/vanilla/basic.d.ts +21 -0
- package/vanilla/hash.d.ts +7 -0
- package/vanilla/shallow.d.ts +6 -0
- package/vanilla/store.d.ts +75 -0
- package/vanilla.d.ts +4 -0
- package/vanilla.js +118 -0
- package/esm/fetcher.d.ts +0 -27
- package/esm/fetcher.js +0 -95
- package/esm/index.d.ts +0 -8
- package/esm/index.js +0 -8
- package/esm/react/create-bi-direction-query.d.ts +0 -166
- package/esm/react/create-bi-direction-query.js +0 -74
- package/esm/react/create-mutation.d.ts +0 -39
- package/esm/react/create-mutation.js +0 -56
- package/esm/react/create-query.d.ts +0 -319
- package/esm/react/create-query.js +0 -434
- package/esm/react/create-store.d.ts +0 -51
- package/esm/react/create-store.js +0 -38
- package/esm/react/create-stores.d.ts +0 -77
- package/esm/react/create-stores.js +0 -125
- package/esm/react/with-context.d.ts +0 -5
- package/esm/react/with-context.js +0 -14
- package/esm/store.d.ts +0 -24
- package/esm/store.js +0 -51
- package/esm/utils.d.ts +0 -24
- package/esm/utils.js +0 -31
- package/lib/fetcher.d.ts +0 -27
- package/lib/fetcher.js +0 -99
- package/lib/index.js +0 -11
- package/lib/react/create-bi-direction-query.d.ts +0 -166
- package/lib/react/create-bi-direction-query.js +0 -78
- package/lib/react/create-mutation.d.ts +0 -39
- package/lib/react/create-mutation.js +0 -60
- package/lib/react/create-query.d.ts +0 -319
- package/lib/react/create-query.js +0 -438
- package/lib/react/create-store.d.ts +0 -51
- package/lib/react/create-store.js +0 -42
- package/lib/react/create-stores.d.ts +0 -77
- package/lib/react/create-stores.js +0 -130
- package/lib/react/with-context.d.ts +0 -5
- package/lib/react/with-context.js +0 -18
- package/lib/store.d.ts +0 -24
- package/lib/store.js +0 -55
- package/lib/utils.d.ts +0 -24
- package/lib/utils.js +0 -39
- 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;
|