synstate 3.0.2 → 3.0.3
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/core/create/from-abortable-promise.d.mts +46 -5
- package/dist/core/create/from-abortable-promise.d.mts.map +1 -1
- package/dist/core/create/from-abortable-promise.mjs +41 -0
- package/dist/core/create/from-abortable-promise.mjs.map +1 -1
- package/package.json +11 -11
- package/src/core/create/from-abortable-promise.mts +46 -5
|
@@ -16,13 +16,54 @@ import { type FromPromiseObservable } from '../types/index.mjs';
|
|
|
16
16
|
*
|
|
17
17
|
* @example
|
|
18
18
|
* ```ts
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
19
|
+
* // Timeline:
|
|
20
|
+
* //
|
|
21
|
+
* // query$ "a" "b"
|
|
22
|
+
* // request a [in flight] | (aborted)
|
|
23
|
+
* // request b [in flight] -> "result for b"
|
|
24
|
+
* // results$ Ok("result for b")
|
|
25
|
+
* //
|
|
26
|
+
* // Explanation:
|
|
27
|
+
* // - fromAbortablePromise hands its factory an AbortSignal
|
|
28
|
+
* // - switchMap completes the previous inner observable, which aborts it
|
|
29
|
+
* // - The AbortError that follows is swallowed, so nothing is emitted for it
|
|
30
|
+
*
|
|
31
|
+
* const search = (query: string, signal: AbortSignal): Promise<string> =>
|
|
32
|
+
* new Promise((resolve, reject) => {
|
|
33
|
+
* const timer = setTimeout(() => {
|
|
34
|
+
* resolve(`result for ${query}`);
|
|
35
|
+
* }, 50);
|
|
36
|
+
*
|
|
37
|
+
* signal.addEventListener('abort', () => {
|
|
38
|
+
* clearTimeout(timer);
|
|
39
|
+
*
|
|
40
|
+
* reject(new DOMException('aborted', 'AbortError'));
|
|
41
|
+
* });
|
|
42
|
+
* });
|
|
43
|
+
*
|
|
44
|
+
* const query$ = source<string>();
|
|
45
|
+
*
|
|
46
|
+
* const results$ = query$.pipe(
|
|
47
|
+
* switchMap((query) =>
|
|
48
|
+
* fromAbortablePromise((signal) => search(query, signal)),
|
|
24
49
|
* ),
|
|
25
50
|
* );
|
|
51
|
+
*
|
|
52
|
+
* const valueHistory: Result<string, unknown>[] = [];
|
|
53
|
+
*
|
|
54
|
+
* results$.subscribe((result) => {
|
|
55
|
+
* valueHistory.push(result);
|
|
56
|
+
* });
|
|
57
|
+
*
|
|
58
|
+
* query$.next('a');
|
|
59
|
+
*
|
|
60
|
+
* query$.next('b');
|
|
61
|
+
*
|
|
62
|
+
* await new Promise<void>((resolve) => {
|
|
63
|
+
* setTimeout(resolve, 150);
|
|
64
|
+
* });
|
|
65
|
+
*
|
|
66
|
+
* assert.deepStrictEqual(valueHistory, [Result.ok('result for b')]);
|
|
26
67
|
* ```
|
|
27
68
|
*/
|
|
28
69
|
export declare const fromAbortablePromise: <A, E = unknown>(factory: (signal: AbortSignal) => Promise<A>) => FromPromiseObservable<A, E>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-abortable-promise.d.mts","sourceRoot":"","sources":["../../../src/core/create/from-abortable-promise.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE
|
|
1
|
+
{"version":3,"file":"from-abortable-promise.d.mts","sourceRoot":"","sources":["../../../src/core/create/from-abortable-promise.mts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,eAAO,MAAM,oBAAoB,GAAI,CAAC,EAAE,CAAC,GAAG,OAAO,WAExC,CAAC,MAAM,EAAE,WAAW,KAAK,OAAO,CAAC,CAAC,CAAC,KAC3C,qBAAqB,CAAC,CAAC,EAAE,CAAC,CA0C5B,CAAC"}
|
|
@@ -20,6 +20,47 @@ import { createRootObservable } from '../base/index.mjs';
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
23
64
|
|
|
24
65
|
|
|
25
66
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"from-abortable-promise.mjs","sourceRoot":"","sources":["../../../src/core/create/from-abortable-promise.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD
|
|
1
|
+
{"version":3,"file":"from-abortable-promise.mjs","sourceRoot":"","sources":["../../../src/core/create/from-abortable-promise.mts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAGzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;AAClC,8EAA8E;AAC9E,OAA4C,EACf,EAAE;IAC/B,MAAM,eAAe,GAAG,IAAI,eAAe,EAAE,CAAC;IAE9C,OAAO,oBAAoB,CACzB;QACE,YAAY,EAAE,QAAQ,CAAC,IAAI;QAC3B,UAAU,EAAE,GAAG,EAAE;YACf,eAAe,CAAC,KAAK,EAAE,CAAC;QAC1B,CAAC;KACF,EACD,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,EAAE,EAAE;QACzC,MAAM,OAAO,GAAG,OAAO,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEhD,OAAO;aACJ,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;YACd,IAAI,WAAW,EAAE;gBAAE,OAAO;YAE1B,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC;QAChC,CAAC,CAAC;aACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YACxB,IAAI,WAAW,EAAE;gBAAE,OAAO;YAE1B,2DAA2D;YAC3D,gDAAgD;YAChD,IAAI,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;gBACjE,OAAO;YACT,CAAC;YAED,WAAW,CACT,MAAM,CAAC,GAAG;YACR,oEAAoE;YACpE,KAAU,CACX,CACF,CAAC;QACJ,CAAC,CAAC;aACD,OAAO,CAAC,GAAG,EAAE;YACZ,QAAQ,EAAE,CAAC;QACb,CAAC,CAAC,CAAC;QAEL,OAAO,EAAE,CAAC;IACZ,CAAC,CACF,CAAC;AACJ,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "synstate",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
4
4
|
"description": "Type-safe State Management Library for TypeScript/JavaScript",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,18 +29,18 @@
|
|
|
29
29
|
"LICENSE"
|
|
30
30
|
],
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"ts-data-forge": "^14.7.
|
|
33
|
-
"ts-std-forge": "^0.5.
|
|
32
|
+
"ts-data-forge": "^14.7.1",
|
|
33
|
+
"ts-std-forge": "^0.5.1",
|
|
34
34
|
"ts-type-forge": "^9.2.2"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@reduxjs/toolkit": "2.12.0",
|
|
38
|
-
"@sumi-lang/cli": "0.0.
|
|
39
|
-
"@types/react": "19.
|
|
40
|
-
"@vitest/browser-playwright": "
|
|
38
|
+
"@sumi-lang/cli": "0.0.3",
|
|
39
|
+
"@types/react": "19.3.0",
|
|
40
|
+
"@vitest/browser-playwright": "5.0.0",
|
|
41
41
|
"argparse": "3.0.1",
|
|
42
|
-
"eslint-config-typed": "5.11.
|
|
43
|
-
"eslint-plugin-ts-data-forge": "0.7.
|
|
42
|
+
"eslint-config-typed": "5.11.7",
|
|
43
|
+
"eslint-plugin-ts-data-forge": "0.7.4",
|
|
44
44
|
"eslint-plugin-ts-fortress": "1.2.2",
|
|
45
45
|
"eslint-plugin-ts-type-forge": "0.8.3",
|
|
46
46
|
"jotai": "2.20.3",
|
|
@@ -51,9 +51,9 @@
|
|
|
51
51
|
"prettier-plugin-packagejson": "3.0.2",
|
|
52
52
|
"react": "19.2.8",
|
|
53
53
|
"rxjs": "7.8.2",
|
|
54
|
-
"synstate-react-hooks": "3.0.
|
|
55
|
-
"synstate-react-hooks-compat": "3.0.
|
|
56
|
-
"ts-repo-utils": "10.6.
|
|
54
|
+
"synstate-react-hooks": "3.0.3",
|
|
55
|
+
"synstate-react-hooks-compat": "3.0.3",
|
|
56
|
+
"ts-repo-utils": "10.6.2",
|
|
57
57
|
"valtio": "2.3.2",
|
|
58
58
|
"zustand": "5.0.15"
|
|
59
59
|
},
|
|
@@ -19,13 +19,54 @@ import { type FromPromiseObservable } from '../types/index.mjs';
|
|
|
19
19
|
*
|
|
20
20
|
* @example
|
|
21
21
|
* ```ts
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
22
|
+
* // Timeline:
|
|
23
|
+
* //
|
|
24
|
+
* // query$ "a" "b"
|
|
25
|
+
* // request a [in flight] | (aborted)
|
|
26
|
+
* // request b [in flight] -> "result for b"
|
|
27
|
+
* // results$ Ok("result for b")
|
|
28
|
+
* //
|
|
29
|
+
* // Explanation:
|
|
30
|
+
* // - fromAbortablePromise hands its factory an AbortSignal
|
|
31
|
+
* // - switchMap completes the previous inner observable, which aborts it
|
|
32
|
+
* // - The AbortError that follows is swallowed, so nothing is emitted for it
|
|
33
|
+
*
|
|
34
|
+
* const search = (query: string, signal: AbortSignal): Promise<string> =>
|
|
35
|
+
* new Promise((resolve, reject) => {
|
|
36
|
+
* const timer = setTimeout(() => {
|
|
37
|
+
* resolve(`result for ${query}`);
|
|
38
|
+
* }, 50);
|
|
39
|
+
*
|
|
40
|
+
* signal.addEventListener('abort', () => {
|
|
41
|
+
* clearTimeout(timer);
|
|
42
|
+
*
|
|
43
|
+
* reject(new DOMException('aborted', 'AbortError'));
|
|
44
|
+
* });
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* const query$ = source<string>();
|
|
48
|
+
*
|
|
49
|
+
* const results$ = query$.pipe(
|
|
50
|
+
* switchMap((query) =>
|
|
51
|
+
* fromAbortablePromise((signal) => search(query, signal)),
|
|
27
52
|
* ),
|
|
28
53
|
* );
|
|
54
|
+
*
|
|
55
|
+
* const valueHistory: Result<string, unknown>[] = [];
|
|
56
|
+
*
|
|
57
|
+
* results$.subscribe((result) => {
|
|
58
|
+
* valueHistory.push(result);
|
|
59
|
+
* });
|
|
60
|
+
*
|
|
61
|
+
* query$.next('a');
|
|
62
|
+
*
|
|
63
|
+
* query$.next('b');
|
|
64
|
+
*
|
|
65
|
+
* await new Promise<void>((resolve) => {
|
|
66
|
+
* setTimeout(resolve, 150);
|
|
67
|
+
* });
|
|
68
|
+
*
|
|
69
|
+
* assert.deepStrictEqual(valueHistory, [Result.ok('result for b')]);
|
|
29
70
|
* ```
|
|
30
71
|
*/
|
|
31
72
|
export const fromAbortablePromise = <A, E = unknown>(
|