awai-react 0.0.1-alpha-10 → 0.0.1-alpha-11
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/dist/index.cjs +91 -60
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.mjs +72 -59
- package/dist/index.mjs.map +1 -1
- package/package.json +12 -13
package/dist/index.cjs
CHANGED
|
@@ -1,79 +1,110 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var React = require('react');
|
|
4
4
|
var awai = require('awai');
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
await Promise.any([
|
|
17
|
-
readable.events.fulfilled.abortable(abortController),
|
|
18
|
-
readable.events.rejected.abortable(abortController),
|
|
19
|
-
readable.events.requested.abortable(abortController)
|
|
20
|
-
]);
|
|
21
|
-
const newAsync = readable.getAsync();
|
|
22
|
-
const isChanged = newAsync.error !== state.error || newAsync.isLoading !== state.isLoading || newAsync.value !== state.value;
|
|
23
|
-
if (isChanged && mounted) {
|
|
24
|
-
setState(readable.getAsync());
|
|
25
|
-
}
|
|
26
|
-
} catch {
|
|
27
|
-
} finally {
|
|
28
|
-
abortController.abort();
|
|
29
|
-
}
|
|
6
|
+
function _interopNamespaceDefault(e) {
|
|
7
|
+
var n = Object.create(null);
|
|
8
|
+
if (e) {
|
|
9
|
+
Object.keys(e).forEach(function (k) {
|
|
10
|
+
if (k !== 'default') {
|
|
11
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
12
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
13
|
+
enumerable: true,
|
|
14
|
+
get: function () { return e[k]; }
|
|
15
|
+
});
|
|
30
16
|
}
|
|
31
|
-
})
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
n.default = e;
|
|
20
|
+
return Object.freeze(n);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
24
|
+
|
|
25
|
+
function createGetSnapshot(readable) {
|
|
26
|
+
if (!awai.isReadableAsyncState(readable)) {
|
|
27
|
+
return () => readable.get();
|
|
28
|
+
}
|
|
29
|
+
let previousSnapshot = void 0;
|
|
30
|
+
return () => {
|
|
31
|
+
const snapshot = readable.getAsync();
|
|
32
|
+
const isEqual = snapshot.error === previousSnapshot?.error && snapshot.isLoading === previousSnapshot?.isLoading && snapshot.value === previousSnapshot?.value;
|
|
33
|
+
if (isEqual) {
|
|
34
|
+
return previousSnapshot;
|
|
35
|
+
}
|
|
36
|
+
previousSnapshot = snapshot;
|
|
37
|
+
return snapshot;
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const createSubscribe = (readable) => {
|
|
42
|
+
return (onStoreChange) => {
|
|
43
|
+
const abortController = new AbortController();
|
|
44
|
+
awai.scenario(
|
|
45
|
+
() => awai.isReadableAsyncState(readable) ? awai.race(
|
|
46
|
+
[readable.events.requested, readable.events.fulfilled, readable.events.rejected],
|
|
47
|
+
abortController.signal
|
|
48
|
+
) : readable.events.changed.abortable(abortController.signal),
|
|
49
|
+
onStoreChange,
|
|
50
|
+
{ until: abortController.signal }
|
|
51
|
+
);
|
|
32
52
|
return () => {
|
|
33
|
-
|
|
34
|
-
abortController?.abort();
|
|
53
|
+
abortController.abort();
|
|
35
54
|
};
|
|
36
|
-
}
|
|
37
|
-
|
|
55
|
+
};
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const useAwaiAsyncValue = (readable) => {
|
|
59
|
+
const subscribe = React.useMemo(() => createSubscribe(readable), [readable]);
|
|
60
|
+
const getSnapshot = React.useMemo(() => createGetSnapshot(readable), [readable]);
|
|
61
|
+
return React.useSyncExternalStore(subscribe, getSnapshot);
|
|
38
62
|
};
|
|
39
63
|
|
|
40
|
-
const
|
|
64
|
+
const useAwaiSetState = (writable) => {
|
|
41
65
|
return writable.set;
|
|
42
66
|
};
|
|
43
67
|
|
|
44
|
-
const
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
68
|
+
const { useMemo, useSyncExternalStore } = React__namespace;
|
|
69
|
+
const { use } = React__namespace;
|
|
70
|
+
const suspend = (promise) => {
|
|
71
|
+
if (use) {
|
|
72
|
+
use(promise);
|
|
73
|
+
return;
|
|
50
74
|
}
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
}
|
|
66
|
-
|
|
75
|
+
throw promise;
|
|
76
|
+
};
|
|
77
|
+
const useAwaiStateValue = (readable) => {
|
|
78
|
+
const isAsync = awai.isReadableAsyncState(readable);
|
|
79
|
+
const getSnapshot = useMemo(() => createGetSnapshot(readable), [readable]);
|
|
80
|
+
const subscribe = useMemo(() => createSubscribe(readable), [readable]);
|
|
81
|
+
const snapshot = useSyncExternalStore(subscribe, getSnapshot);
|
|
82
|
+
const isLoading = isAsync && snapshot.isLoading;
|
|
83
|
+
const isSettledPromise = useMemo(
|
|
84
|
+
() => isLoading ? readable.getPromise() : void 0,
|
|
85
|
+
[readable, isLoading]
|
|
86
|
+
);
|
|
87
|
+
if (!isAsync) {
|
|
88
|
+
return snapshot;
|
|
89
|
+
}
|
|
90
|
+
const asyncSnapshot = snapshot;
|
|
91
|
+
if (asyncSnapshot.error) {
|
|
92
|
+
throw asyncSnapshot.error;
|
|
93
|
+
}
|
|
94
|
+
if (isSettledPromise) {
|
|
95
|
+
suspend(isSettledPromise);
|
|
96
|
+
}
|
|
97
|
+
return asyncSnapshot.value;
|
|
67
98
|
};
|
|
68
99
|
|
|
69
|
-
function
|
|
70
|
-
const value =
|
|
71
|
-
const setValue =
|
|
100
|
+
function useAwaiState(state) {
|
|
101
|
+
const value = useAwaiStateValue(state);
|
|
102
|
+
const setValue = useAwaiSetState(state);
|
|
72
103
|
return [value, setValue];
|
|
73
104
|
}
|
|
74
105
|
|
|
75
|
-
exports.
|
|
76
|
-
exports.
|
|
77
|
-
exports.
|
|
78
|
-
exports.
|
|
106
|
+
exports.useAwaiAsyncValue = useAwaiAsyncValue;
|
|
107
|
+
exports.useAwaiSetState = useAwaiSetState;
|
|
108
|
+
exports.useAwaiState = useAwaiState;
|
|
109
|
+
exports.useAwaiStateValue = useAwaiStateValue;
|
|
79
110
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/lib/createGetSnapshot.ts","../src/lib/createSubscribe.ts","../src/useAwaiAsyncValue.ts","../src/useAwaiSetState.ts","../src/useAwaiStateValue.ts","../src/useAwaiState.ts"],"sourcesContent":["import { AsyncValue, isReadableAsyncState, ReadableAsyncState, ReadableState } from 'awai';\n\ntype SnapshotValue<R> = R extends ReadableAsyncState<infer T>\n ? AsyncValue<T>\n : R extends ReadableState<infer T>\n ? T\n : never;\n\ntype ReadableInput = ReadableState<any> | ReadableAsyncState<any>;\n\nfunction createGetSnapshot<const R extends ReadableInput>(readable: R): () => SnapshotValue<R> {\n if (!isReadableAsyncState(readable)) {\n return () => readable.get();\n }\n\n let previousSnapshot: AsyncValue<unknown> | undefined = undefined;\n\n return () => {\n const snapshot = readable.getAsync();\n const isEqual =\n snapshot.error === previousSnapshot?.error &&\n snapshot.isLoading === previousSnapshot?.isLoading &&\n snapshot.value === previousSnapshot?.value;\n\n if (isEqual) {\n return previousSnapshot as SnapshotValue<R>;\n }\n\n previousSnapshot = snapshot;\n return snapshot as SnapshotValue<R>;\n };\n}\n\nexport default createGetSnapshot;\n","import { isReadableAsyncState, ReadableAsyncState, ReadableState, race, scenario } from 'awai';\n\nconst createSubscribe = <T extends ReadableState<any> | ReadableAsyncState<any>>(readable: T) => {\n return (onStoreChange: () => void) => {\n const abortController = new AbortController();\n\n scenario(\n () =>\n isReadableAsyncState(readable)\n ? race(\n [readable.events.requested, readable.events.fulfilled, readable.events.rejected],\n abortController.signal,\n )\n : readable.events.changed.abortable(abortController.signal),\n onStoreChange,\n { until: abortController.signal },\n );\n\n return () => {\n abortController.abort();\n };\n };\n};\n\nexport default createSubscribe;\n","import type { ReadableAsyncState, AsyncValue } from 'awai';\nimport { useMemo, useSyncExternalStore } from 'react';\nimport createGetSnapshot from './lib/createGetSnapshot';\nimport createSubscribe from './lib/createSubscribe';\n\nconst useAwaiAsyncValue = <T>(readable: ReadableAsyncState<T>): AsyncValue<T> => {\n const subscribe = useMemo(() => createSubscribe(readable), [readable]);\n const getSnapshot = useMemo(() => createGetSnapshot(readable), [readable]);\n\n return useSyncExternalStore(subscribe, getSnapshot);\n};\n\nexport default useAwaiAsyncValue;\n","import type { WritableAsyncState, WritableState } from 'awai';\n\nconst useAwaiSetState = <Q extends WritableState<T> | WritableAsyncState<T>, T = any>(\n writable: Q,\n): Q['set'] => {\n return writable.set;\n};\n\nexport default useAwaiSetState;\n","import {\n type AsyncValue,\n type ReadableAsyncState,\n type ReadableState,\n isReadableAsyncState,\n} from 'awai';\nimport * as React from 'react';\nimport createSubscribe from './lib/createSubscribe';\nimport createGetSnapshot from './lib/createGetSnapshot';\n\nconst { useMemo, useSyncExternalStore } = React;\nconst { use } = React as { use?: (promise: Promise<unknown>) => unknown };\nconst suspend = (promise: Promise<unknown>) => {\n if (use) {\n use(promise);\n return;\n }\n\n throw promise;\n};\n\nconst useAwaiStateValue = <T>(readable: ReadableState<T> | ReadableAsyncState<T>): T => {\n const isAsync = isReadableAsyncState(readable);\n const getSnapshot = useMemo(() => createGetSnapshot(readable), [readable]);\n const subscribe = useMemo(() => createSubscribe(readable), [readable]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot);\n const isLoading = isAsync && (snapshot as AsyncValue<T>).isLoading;\n\n const isSettledPromise = useMemo(\n () => (isLoading ? readable.getPromise() : undefined),\n [readable, isLoading],\n );\n\n if (!isAsync) {\n return snapshot as T;\n }\n\n const asyncSnapshot = snapshot as AsyncValue<T>;\n\n if (asyncSnapshot.error) {\n throw asyncSnapshot.error;\n }\n\n if (isSettledPromise) {\n suspend(isSettledPromise);\n }\n\n return asyncSnapshot.value!;\n};\n\nexport default useAwaiStateValue;\n","import type { AsyncSetter, AsyncState, Setter, State } from 'awai';\n\nimport useAwaiSetState from './useAwaiSetState';\nimport useAwaiStateValue from './useAwaiStateValue';\n\ntype Return<T> = T extends State<infer U>\n ? [U, Setter<U>]\n : T extends AsyncState<infer V>\n ? [V, AsyncSetter<V>]\n : never;\n\nfunction useAwaiState<T>(state: State<T>): Return<State<T>>;\nfunction useAwaiState<T>(state: AsyncState<T>): Return<AsyncState<T>>;\nfunction useAwaiState<T>(state: State<T> | AsyncState<T>) {\n const value = useAwaiStateValue(state);\n const setValue = useAwaiSetState(state);\n\n return [value, setValue];\n}\n\nexport default useAwaiState;\n"],"names":["isReadableAsyncState","scenario","race","useMemo","useSyncExternalStore","React"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import { ReadableAsyncState,
|
|
1
|
+
import { ReadableAsyncState, AsyncValue, WritableState, WritableAsyncState, State, AsyncState, Setter, AsyncSetter, ReadableState } from 'awai';
|
|
2
2
|
|
|
3
|
-
declare const
|
|
3
|
+
declare const useAwaiAsyncValue: <T>(readable: ReadableAsyncState<T>) => AsyncValue<T>;
|
|
4
4
|
|
|
5
|
-
declare const
|
|
5
|
+
declare const useAwaiSetState: <Q extends WritableState<T> | WritableAsyncState<T>, T = any>(writable: Q) => Q["set"];
|
|
6
6
|
|
|
7
7
|
type Return<T> = T extends State<infer U> ? [U, Setter<U>] : T extends AsyncState<infer V> ? [V, AsyncSetter<V>] : never;
|
|
8
|
-
declare function
|
|
9
|
-
declare function
|
|
8
|
+
declare function useAwaiState<T>(state: State<T>): Return<State<T>>;
|
|
9
|
+
declare function useAwaiState<T>(state: AsyncState<T>): Return<AsyncState<T>>;
|
|
10
10
|
|
|
11
|
-
declare const
|
|
11
|
+
declare const useAwaiStateValue: <T>(readable: ReadableState<T> | ReadableAsyncState<T>) => T;
|
|
12
12
|
|
|
13
|
-
export {
|
|
13
|
+
export { useAwaiAsyncValue, useAwaiSetState, useAwaiState, useAwaiStateValue };
|
package/dist/index.mjs
CHANGED
|
@@ -1,74 +1,87 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { useMemo as useMemo$1, useSyncExternalStore as useSyncExternalStore$1 } from 'react';
|
|
3
|
+
import { isReadableAsyncState, scenario, race } from 'awai';
|
|
3
4
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
5
|
+
function createGetSnapshot(readable) {
|
|
6
|
+
if (!isReadableAsyncState(readable)) {
|
|
7
|
+
return () => readable.get();
|
|
8
|
+
}
|
|
9
|
+
let previousSnapshot = void 0;
|
|
10
|
+
return () => {
|
|
11
|
+
const snapshot = readable.getAsync();
|
|
12
|
+
const isEqual = snapshot.error === previousSnapshot?.error && snapshot.isLoading === previousSnapshot?.isLoading && snapshot.value === previousSnapshot?.value;
|
|
13
|
+
if (isEqual) {
|
|
14
|
+
return previousSnapshot;
|
|
15
|
+
}
|
|
16
|
+
previousSnapshot = snapshot;
|
|
17
|
+
return snapshot;
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
const createSubscribe = (readable) => {
|
|
22
|
+
return (onStoreChange) => {
|
|
23
|
+
const abortController = new AbortController();
|
|
24
|
+
scenario(
|
|
25
|
+
() => isReadableAsyncState(readable) ? race(
|
|
26
|
+
[readable.events.requested, readable.events.fulfilled, readable.events.rejected],
|
|
27
|
+
abortController.signal
|
|
28
|
+
) : readable.events.changed.abortable(abortController.signal),
|
|
29
|
+
onStoreChange,
|
|
30
|
+
{ until: abortController.signal }
|
|
31
|
+
);
|
|
30
32
|
return () => {
|
|
31
|
-
|
|
32
|
-
abortController?.abort();
|
|
33
|
+
abortController.abort();
|
|
33
34
|
};
|
|
34
|
-
}
|
|
35
|
-
return state;
|
|
35
|
+
};
|
|
36
36
|
};
|
|
37
37
|
|
|
38
|
-
const
|
|
38
|
+
const useAwaiAsyncValue = (readable) => {
|
|
39
|
+
const subscribe = useMemo$1(() => createSubscribe(readable), [readable]);
|
|
40
|
+
const getSnapshot = useMemo$1(() => createGetSnapshot(readable), [readable]);
|
|
41
|
+
return useSyncExternalStore$1(subscribe, getSnapshot);
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
const useAwaiSetState = (writable) => {
|
|
39
45
|
return writable.set;
|
|
40
46
|
};
|
|
41
47
|
|
|
42
|
-
const
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
+
const { useMemo, useSyncExternalStore } = React;
|
|
49
|
+
const { use } = React;
|
|
50
|
+
const suspend = (promise) => {
|
|
51
|
+
if (use) {
|
|
52
|
+
use(promise);
|
|
53
|
+
return;
|
|
48
54
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
}
|
|
64
|
-
|
|
55
|
+
throw promise;
|
|
56
|
+
};
|
|
57
|
+
const useAwaiStateValue = (readable) => {
|
|
58
|
+
const isAsync = isReadableAsyncState(readable);
|
|
59
|
+
const getSnapshot = useMemo(() => createGetSnapshot(readable), [readable]);
|
|
60
|
+
const subscribe = useMemo(() => createSubscribe(readable), [readable]);
|
|
61
|
+
const snapshot = useSyncExternalStore(subscribe, getSnapshot);
|
|
62
|
+
const isLoading = isAsync && snapshot.isLoading;
|
|
63
|
+
const isSettledPromise = useMemo(
|
|
64
|
+
() => isLoading ? readable.getPromise() : void 0,
|
|
65
|
+
[readable, isLoading]
|
|
66
|
+
);
|
|
67
|
+
if (!isAsync) {
|
|
68
|
+
return snapshot;
|
|
69
|
+
}
|
|
70
|
+
const asyncSnapshot = snapshot;
|
|
71
|
+
if (asyncSnapshot.error) {
|
|
72
|
+
throw asyncSnapshot.error;
|
|
73
|
+
}
|
|
74
|
+
if (isSettledPromise) {
|
|
75
|
+
suspend(isSettledPromise);
|
|
76
|
+
}
|
|
77
|
+
return asyncSnapshot.value;
|
|
65
78
|
};
|
|
66
79
|
|
|
67
|
-
function
|
|
68
|
-
const value =
|
|
69
|
-
const setValue =
|
|
80
|
+
function useAwaiState(state) {
|
|
81
|
+
const value = useAwaiStateValue(state);
|
|
82
|
+
const setValue = useAwaiSetState(state);
|
|
70
83
|
return [value, setValue];
|
|
71
84
|
}
|
|
72
85
|
|
|
73
|
-
export {
|
|
86
|
+
export { useAwaiAsyncValue, useAwaiSetState, useAwaiState, useAwaiStateValue };
|
|
74
87
|
//# sourceMappingURL=index.mjs.map
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../src/
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../src/lib/createGetSnapshot.ts","../src/lib/createSubscribe.ts","../src/useAwaiAsyncValue.ts","../src/useAwaiSetState.ts","../src/useAwaiStateValue.ts","../src/useAwaiState.ts"],"sourcesContent":["import { AsyncValue, isReadableAsyncState, ReadableAsyncState, ReadableState } from 'awai';\n\ntype SnapshotValue<R> = R extends ReadableAsyncState<infer T>\n ? AsyncValue<T>\n : R extends ReadableState<infer T>\n ? T\n : never;\n\ntype ReadableInput = ReadableState<any> | ReadableAsyncState<any>;\n\nfunction createGetSnapshot<const R extends ReadableInput>(readable: R): () => SnapshotValue<R> {\n if (!isReadableAsyncState(readable)) {\n return () => readable.get();\n }\n\n let previousSnapshot: AsyncValue<unknown> | undefined = undefined;\n\n return () => {\n const snapshot = readable.getAsync();\n const isEqual =\n snapshot.error === previousSnapshot?.error &&\n snapshot.isLoading === previousSnapshot?.isLoading &&\n snapshot.value === previousSnapshot?.value;\n\n if (isEqual) {\n return previousSnapshot as SnapshotValue<R>;\n }\n\n previousSnapshot = snapshot;\n return snapshot as SnapshotValue<R>;\n };\n}\n\nexport default createGetSnapshot;\n","import { isReadableAsyncState, ReadableAsyncState, ReadableState, race, scenario } from 'awai';\n\nconst createSubscribe = <T extends ReadableState<any> | ReadableAsyncState<any>>(readable: T) => {\n return (onStoreChange: () => void) => {\n const abortController = new AbortController();\n\n scenario(\n () =>\n isReadableAsyncState(readable)\n ? race(\n [readable.events.requested, readable.events.fulfilled, readable.events.rejected],\n abortController.signal,\n )\n : readable.events.changed.abortable(abortController.signal),\n onStoreChange,\n { until: abortController.signal },\n );\n\n return () => {\n abortController.abort();\n };\n };\n};\n\nexport default createSubscribe;\n","import type { ReadableAsyncState, AsyncValue } from 'awai';\nimport { useMemo, useSyncExternalStore } from 'react';\nimport createGetSnapshot from './lib/createGetSnapshot';\nimport createSubscribe from './lib/createSubscribe';\n\nconst useAwaiAsyncValue = <T>(readable: ReadableAsyncState<T>): AsyncValue<T> => {\n const subscribe = useMemo(() => createSubscribe(readable), [readable]);\n const getSnapshot = useMemo(() => createGetSnapshot(readable), [readable]);\n\n return useSyncExternalStore(subscribe, getSnapshot);\n};\n\nexport default useAwaiAsyncValue;\n","import type { WritableAsyncState, WritableState } from 'awai';\n\nconst useAwaiSetState = <Q extends WritableState<T> | WritableAsyncState<T>, T = any>(\n writable: Q,\n): Q['set'] => {\n return writable.set;\n};\n\nexport default useAwaiSetState;\n","import {\n type AsyncValue,\n type ReadableAsyncState,\n type ReadableState,\n isReadableAsyncState,\n} from 'awai';\nimport * as React from 'react';\nimport createSubscribe from './lib/createSubscribe';\nimport createGetSnapshot from './lib/createGetSnapshot';\n\nconst { useMemo, useSyncExternalStore } = React;\nconst { use } = React as { use?: (promise: Promise<unknown>) => unknown };\nconst suspend = (promise: Promise<unknown>) => {\n if (use) {\n use(promise);\n return;\n }\n\n throw promise;\n};\n\nconst useAwaiStateValue = <T>(readable: ReadableState<T> | ReadableAsyncState<T>): T => {\n const isAsync = isReadableAsyncState(readable);\n const getSnapshot = useMemo(() => createGetSnapshot(readable), [readable]);\n const subscribe = useMemo(() => createSubscribe(readable), [readable]);\n const snapshot = useSyncExternalStore(subscribe, getSnapshot);\n const isLoading = isAsync && (snapshot as AsyncValue<T>).isLoading;\n\n const isSettledPromise = useMemo(\n () => (isLoading ? readable.getPromise() : undefined),\n [readable, isLoading],\n );\n\n if (!isAsync) {\n return snapshot as T;\n }\n\n const asyncSnapshot = snapshot as AsyncValue<T>;\n\n if (asyncSnapshot.error) {\n throw asyncSnapshot.error;\n }\n\n if (isSettledPromise) {\n suspend(isSettledPromise);\n }\n\n return asyncSnapshot.value!;\n};\n\nexport default useAwaiStateValue;\n","import type { AsyncSetter, AsyncState, Setter, State } from 'awai';\n\nimport useAwaiSetState from './useAwaiSetState';\nimport useAwaiStateValue from './useAwaiStateValue';\n\ntype Return<T> = T extends State<infer U>\n ? [U, Setter<U>]\n : T extends AsyncState<infer V>\n ? [V, AsyncSetter<V>]\n : never;\n\nfunction useAwaiState<T>(state: State<T>): Return<State<T>>;\nfunction useAwaiState<T>(state: AsyncState<T>): Return<AsyncState<T>>;\nfunction useAwaiState<T>(state: State<T> | AsyncState<T>) {\n const value = useAwaiStateValue(state);\n const setValue = useAwaiSetState(state);\n\n return [value, setValue];\n}\n\nexport default useAwaiState;\n"],"names":["useMemo","useSyncExternalStore"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "awai-react",
|
|
3
|
-
"version": "v0.0.1-alpha-
|
|
3
|
+
"version": "v0.0.1-alpha-11",
|
|
4
4
|
"author": "Yuriy Yakym",
|
|
5
5
|
"description": "React hooks for Awai integration",
|
|
6
6
|
"license": "MIT",
|
|
@@ -20,8 +20,8 @@
|
|
|
20
20
|
],
|
|
21
21
|
"scripts": {
|
|
22
22
|
"build": "rm -rf dist && rollup -c rollup.config.js",
|
|
23
|
-
"test": "
|
|
24
|
-
"test:watch": "
|
|
23
|
+
"test": "vitest run",
|
|
24
|
+
"test:watch": "vitest"
|
|
25
25
|
},
|
|
26
26
|
"repository": {
|
|
27
27
|
"type": "git",
|
|
@@ -40,21 +40,20 @@
|
|
|
40
40
|
"async"
|
|
41
41
|
],
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@
|
|
44
|
-
"@types/
|
|
45
|
-
"
|
|
46
|
-
"
|
|
47
|
-
"
|
|
48
|
-
"
|
|
49
|
-
"react": "^18.2.0",
|
|
43
|
+
"@types/react": "^19.0.0",
|
|
44
|
+
"@types/react-dom": "^19.2.3",
|
|
45
|
+
"awai": "^1.0.0-rc-7",
|
|
46
|
+
"jsdom": "^24.0.0",
|
|
47
|
+
"react": "^19.0.0",
|
|
48
|
+
"react-dom": "^19.2.3",
|
|
50
49
|
"rollup": "^3.26.3",
|
|
51
50
|
"rollup-plugin-dts": "^5.3.0",
|
|
52
51
|
"rollup-plugin-esbuild": "^5.0.0",
|
|
53
|
-
"
|
|
54
|
-
"
|
|
52
|
+
"typescript": "^5.1.6",
|
|
53
|
+
"vitest": "^2.1.0"
|
|
55
54
|
},
|
|
56
55
|
"peerDependencies": {
|
|
57
56
|
"awai": "*",
|
|
58
|
-
"react": "
|
|
57
|
+
"react": "^18.2.0 || ^19.0.0"
|
|
59
58
|
}
|
|
60
59
|
}
|