rexfect 0.0.7
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 +1756 -0
- package/dist/abortableContext.d.ts +3 -0
- package/dist/abortableContext.d.ts.map +1 -0
- package/dist/abortableContext.js +48 -0
- package/dist/abortableContext.js.map +1 -0
- package/dist/action.d.ts +64 -0
- package/dist/action.d.ts.map +1 -0
- package/dist/action.js +208 -0
- package/dist/action.js.map +1 -0
- package/dist/action.test.d.ts +2 -0
- package/dist/action.test.d.ts.map +1 -0
- package/dist/action.test.js +189 -0
- package/dist/action.test.js.map +1 -0
- package/dist/async/abortable-guard.d.ts +25 -0
- package/dist/async/abortable-guard.d.ts.map +1 -0
- package/dist/async/abortable-guard.js +33 -0
- package/dist/async/abortable-guard.js.map +1 -0
- package/dist/async/abortable.d.ts +331 -0
- package/dist/async/abortable.d.ts.map +1 -0
- package/dist/async/abortable.js +410 -0
- package/dist/async/abortable.js.map +1 -0
- package/dist/async/abortable.test.d.ts +2 -0
- package/dist/async/abortable.test.d.ts.map +1 -0
- package/dist/async/abortable.test.js +535 -0
- package/dist/async/abortable.test.js.map +1 -0
- package/dist/async/abortable.typeCheck.d.ts +8 -0
- package/dist/async/abortable.typeCheck.d.ts.map +1 -0
- package/dist/async/abortable.typeCheck.js +138 -0
- package/dist/async/abortable.typeCheck.js.map +1 -0
- package/dist/async/async.d.ts +18 -0
- package/dist/async/async.d.ts.map +1 -0
- package/dist/async/async.js +20 -0
- package/dist/async/async.js.map +1 -0
- package/dist/async/index.d.ts +15 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/index.js +13 -0
- package/dist/async/index.js.map +1 -0
- package/dist/async/loadable.d.ts +7 -0
- package/dist/async/loadable.d.ts.map +1 -0
- package/dist/async/loadable.js +52 -0
- package/dist/async/loadable.js.map +1 -0
- package/dist/async/loadable.test.d.ts +2 -0
- package/dist/async/loadable.test.d.ts.map +1 -0
- package/dist/async/loadable.test.js +322 -0
- package/dist/async/loadable.test.js.map +1 -0
- package/dist/async/promiseCache.d.ts +14 -0
- package/dist/async/promiseCache.d.ts.map +1 -0
- package/dist/async/promiseCache.js +29 -0
- package/dist/async/promiseCache.js.map +1 -0
- package/dist/async/read.d.ts +120 -0
- package/dist/async/read.d.ts.map +1 -0
- package/dist/async/read.js +286 -0
- package/dist/async/read.js.map +1 -0
- package/dist/async/read.test.d.ts +2 -0
- package/dist/async/read.test.d.ts.map +1 -0
- package/dist/async/read.test.js +419 -0
- package/dist/async/read.test.js.map +1 -0
- package/dist/async/read.typeCheck.d.ts +6 -0
- package/dist/async/read.typeCheck.d.ts.map +1 -0
- package/dist/async/read.typeCheck.js +101 -0
- package/dist/async/read.typeCheck.js.map +1 -0
- package/dist/async/safe.d.ts +230 -0
- package/dist/async/safe.d.ts.map +1 -0
- package/dist/async/safe.js +247 -0
- package/dist/async/safe.js.map +1 -0
- package/dist/async/safe.test.d.ts +2 -0
- package/dist/async/safe.test.d.ts.map +1 -0
- package/dist/async/safe.test.js +447 -0
- package/dist/async/safe.test.js.map +1 -0
- package/dist/async/utils.d.ts +17 -0
- package/dist/async/utils.d.ts.map +1 -0
- package/dist/async/utils.js +38 -0
- package/dist/async/utils.js.map +1 -0
- package/dist/async/wait.d.ts +120 -0
- package/dist/async/wait.d.ts.map +1 -0
- package/dist/async/wait.js +112 -0
- package/dist/async/wait.js.map +1 -0
- package/dist/async/wait.test.d.ts +2 -0
- package/dist/async/wait.test.d.ts.map +1 -0
- package/dist/async/wait.test.js +122 -0
- package/dist/async/wait.test.js.map +1 -0
- package/dist/async/wait.typeCheck.d.ts +6 -0
- package/dist/async/wait.typeCheck.d.ts.map +1 -0
- package/dist/async/wait.typeCheck.js +104 -0
- package/dist/async/wait.typeCheck.js.map +1 -0
- package/dist/atom.d.ts +46 -0
- package/dist/atom.d.ts.map +1 -0
- package/dist/atom.js +86 -0
- package/dist/atom.js.map +1 -0
- package/dist/atom.test.d.ts +2 -0
- package/dist/atom.test.d.ts.map +1 -0
- package/dist/atom.test.js +75 -0
- package/dist/atom.test.js.map +1 -0
- package/dist/batch.d.ts +15 -0
- package/dist/batch.d.ts.map +1 -0
- package/dist/batch.js +45 -0
- package/dist/batch.js.map +1 -0
- package/dist/defer.d.ts +56 -0
- package/dist/defer.d.ts.map +1 -0
- package/dist/defer.js +49 -0
- package/dist/defer.js.map +1 -0
- package/dist/effect.d.ts +91 -0
- package/dist/effect.d.ts.map +1 -0
- package/dist/effect.js +311 -0
- package/dist/effect.js.map +1 -0
- package/dist/effect.test.d.ts +2 -0
- package/dist/effect.test.d.ts.map +1 -0
- package/dist/effect.test.js +123 -0
- package/dist/effect.test.js.map +1 -0
- package/dist/emitter.d.ts +129 -0
- package/dist/emitter.d.ts.map +1 -0
- package/dist/emitter.js +164 -0
- package/dist/emitter.js.map +1 -0
- package/dist/emitter.test.d.ts +2 -0
- package/dist/emitter.test.d.ts.map +1 -0
- package/dist/emitter.test.js +259 -0
- package/dist/emitter.test.js.map +1 -0
- package/dist/equality.d.ts +66 -0
- package/dist/equality.d.ts.map +1 -0
- package/dist/equality.js +145 -0
- package/dist/equality.js.map +1 -0
- package/dist/event.d.ts +18 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +166 -0
- package/dist/event.js.map +1 -0
- package/dist/event.test.d.ts +2 -0
- package/dist/event.test.d.ts.map +1 -0
- package/dist/event.test.js +167 -0
- package/dist/event.test.js.map +1 -0
- package/dist/hooks.d.ts +152 -0
- package/dist/hooks.d.ts.map +1 -0
- package/dist/hooks.js +122 -0
- package/dist/hooks.js.map +1 -0
- package/dist/hooks.test.d.ts +2 -0
- package/dist/hooks.test.d.ts.map +1 -0
- package/dist/hooks.test.js +99 -0
- package/dist/hooks.test.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +35 -0
- package/dist/index.js.map +1 -0
- package/dist/isPromiseLike.d.ts +10 -0
- package/dist/isPromiseLike.d.ts.map +1 -0
- package/dist/isPromiseLike.js +15 -0
- package/dist/isPromiseLike.js.map +1 -0
- package/dist/pick.d.ts +22 -0
- package/dist/pick.d.ts.map +1 -0
- package/dist/pick.js +46 -0
- package/dist/pick.js.map +1 -0
- package/dist/react/index.d.ts +8 -0
- package/dist/react/index.d.ts.map +1 -0
- package/dist/react/index.js +8 -0
- package/dist/react/index.js.map +1 -0
- package/dist/react/useRx.d.ts +14 -0
- package/dist/react/useRx.d.ts.map +1 -0
- package/dist/react/useRx.js +110 -0
- package/dist/react/useRx.js.map +1 -0
- package/dist/react/useRx.test.d.ts +2 -0
- package/dist/react/useRx.test.d.ts.map +1 -0
- package/dist/react/useRx.test.js +457 -0
- package/dist/react/useRx.test.js.map +1 -0
- package/dist/strictModeTest.d.ts +11 -0
- package/dist/strictModeTest.d.ts.map +1 -0
- package/dist/strictModeTest.js +41 -0
- package/dist/strictModeTest.js.map +1 -0
- package/dist/types.d.ts +606 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/untrack.d.ts +14 -0
- package/dist/untrack.d.ts.map +1 -0
- package/dist/untrack.js +17 -0
- package/dist/untrack.js.map +1 -0
- package/dist/utils/withUse.d.ts +10 -0
- package/dist/utils/withUse.d.ts.map +1 -0
- package/dist/utils/withUse.js +21 -0
- package/dist/utils/withUse.js.map +1 -0
- package/dist/utils/withUse.test.d.ts +2 -0
- package/dist/utils/withUse.test.d.ts.map +1 -0
- package/dist/utils/withUse.test.js +233 -0
- package/dist/utils/withUse.test.js.map +1 -0
- package/dist/utils.d.ts +7 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -0
- package/dist/utils.test.d.ts +2 -0
- package/dist/utils.test.d.ts.map +1 -0
- package/dist/utils.test.js +119 -0
- package/dist/utils.test.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { describe, it, expect, vi, beforeEach } from "vitest";
|
|
2
|
+
import { createSafe, isPromiseLike } from "./safe";
|
|
3
|
+
import { toPromise } from "./async";
|
|
4
|
+
describe("isPromiseLike", () => {
|
|
5
|
+
it("should return true for native Promise", () => {
|
|
6
|
+
expect(isPromiseLike(Promise.resolve(1))).toBe(true);
|
|
7
|
+
});
|
|
8
|
+
it("should return true for thenable objects", () => {
|
|
9
|
+
const thenable = { then: () => { } };
|
|
10
|
+
expect(isPromiseLike(thenable)).toBe(true);
|
|
11
|
+
});
|
|
12
|
+
it("should return false for non-promise values", () => {
|
|
13
|
+
expect(isPromiseLike(42)).toBe(false);
|
|
14
|
+
expect(isPromiseLike("string")).toBe(false);
|
|
15
|
+
expect(isPromiseLike(null)).toBe(false);
|
|
16
|
+
expect(isPromiseLike(undefined)).toBe(false);
|
|
17
|
+
expect(isPromiseLike({})).toBe(false);
|
|
18
|
+
expect(isPromiseLike({ then: "not a function" })).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
it("should return false for functions", () => {
|
|
21
|
+
expect(isPromiseLike(() => { })).toBe(false);
|
|
22
|
+
});
|
|
23
|
+
});
|
|
24
|
+
describe("toPromise", () => {
|
|
25
|
+
it("should wrap sync value in Promise", async () => {
|
|
26
|
+
const result = await toPromise(42);
|
|
27
|
+
expect(result).toBe(42);
|
|
28
|
+
});
|
|
29
|
+
it("should return Promise as-is (normalized)", async () => {
|
|
30
|
+
const promise = Promise.resolve("hello");
|
|
31
|
+
const result = await toPromise(promise);
|
|
32
|
+
expect(result).toBe("hello");
|
|
33
|
+
});
|
|
34
|
+
it("should invoke parameterless function and wrap result", async () => {
|
|
35
|
+
const fn = () => 42;
|
|
36
|
+
const result = await toPromise(fn);
|
|
37
|
+
expect(result).toBe(42);
|
|
38
|
+
});
|
|
39
|
+
it("should invoke function returning Promise", async () => {
|
|
40
|
+
const fn = () => Promise.resolve("async");
|
|
41
|
+
const result = await toPromise(fn);
|
|
42
|
+
expect(result).toBe("async");
|
|
43
|
+
});
|
|
44
|
+
it("should handle nested functions", async () => {
|
|
45
|
+
const fn = () => () => 42;
|
|
46
|
+
const result = await toPromise(fn);
|
|
47
|
+
expect(result).toBe(42);
|
|
48
|
+
});
|
|
49
|
+
it("should handle thenable objects", async () => {
|
|
50
|
+
const thenable = {
|
|
51
|
+
then: (onfulfilled, _onrejected) => {
|
|
52
|
+
if (onfulfilled) {
|
|
53
|
+
return Promise.resolve(onfulfilled(99));
|
|
54
|
+
}
|
|
55
|
+
return Promise.resolve(99);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
const result = await toPromise(thenable);
|
|
59
|
+
expect(result).toBe(99);
|
|
60
|
+
});
|
|
61
|
+
it("should reject if function throws", async () => {
|
|
62
|
+
const fn = () => {
|
|
63
|
+
throw new Error("oops");
|
|
64
|
+
};
|
|
65
|
+
await expect(toPromise(fn)).rejects.toThrow("oops");
|
|
66
|
+
});
|
|
67
|
+
it("should reject if function returns rejected Promise", async () => {
|
|
68
|
+
const fn = () => Promise.reject(new Error("async error"));
|
|
69
|
+
await expect(toPromise(fn)).rejects.toThrow("async error");
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe("createSafe", () => {
|
|
73
|
+
let cancelled;
|
|
74
|
+
let safe;
|
|
75
|
+
beforeEach(() => {
|
|
76
|
+
cancelled = false;
|
|
77
|
+
safe = createSafe(() => undefined, () => cancelled);
|
|
78
|
+
});
|
|
79
|
+
describe("safe()", () => {
|
|
80
|
+
it("should resolve promise if not cancelled", async () => {
|
|
81
|
+
const result = await safe(Promise.resolve(42));
|
|
82
|
+
expect(result).toBe(42);
|
|
83
|
+
});
|
|
84
|
+
it("should never resolve if cancelled before call", async () => {
|
|
85
|
+
cancelled = true;
|
|
86
|
+
let resolved = false;
|
|
87
|
+
safe(Promise.resolve(42)).then(() => {
|
|
88
|
+
resolved = true;
|
|
89
|
+
});
|
|
90
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
91
|
+
expect(resolved).toBe(false);
|
|
92
|
+
});
|
|
93
|
+
it("should never resolve if cancelled during promise", async () => {
|
|
94
|
+
let resolved = false;
|
|
95
|
+
const promise = new Promise((resolve) => {
|
|
96
|
+
setTimeout(() => resolve(42), 50);
|
|
97
|
+
});
|
|
98
|
+
safe(promise).then(() => {
|
|
99
|
+
resolved = true;
|
|
100
|
+
});
|
|
101
|
+
// Cancel before promise resolves
|
|
102
|
+
cancelled = true;
|
|
103
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
104
|
+
expect(resolved).toBe(false);
|
|
105
|
+
});
|
|
106
|
+
it("should call function and wrap result", async () => {
|
|
107
|
+
const fn = vi.fn().mockResolvedValue("result");
|
|
108
|
+
const result = await safe(fn, "arg1", "arg2");
|
|
109
|
+
expect(fn).toHaveBeenCalledWith("arg1", "arg2");
|
|
110
|
+
expect(result).toBe("result");
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe("safe.all", () => {
|
|
114
|
+
describe("array syntax", () => {
|
|
115
|
+
it("should resolve all promises", async () => {
|
|
116
|
+
const result = await safe.all([
|
|
117
|
+
Promise.resolve(1),
|
|
118
|
+
Promise.resolve("two"),
|
|
119
|
+
Promise.resolve(true),
|
|
120
|
+
]);
|
|
121
|
+
expect(result).toEqual([1, "two", true]);
|
|
122
|
+
});
|
|
123
|
+
it("should invoke functions", async () => {
|
|
124
|
+
const fn1 = vi.fn().mockReturnValue(1);
|
|
125
|
+
const fn2 = vi.fn().mockResolvedValue(2);
|
|
126
|
+
const result = await safe.all([fn1, fn2]);
|
|
127
|
+
expect(fn1).toHaveBeenCalled();
|
|
128
|
+
expect(fn2).toHaveBeenCalled();
|
|
129
|
+
expect(result).toEqual([1, 2]);
|
|
130
|
+
});
|
|
131
|
+
it("should handle mixed inputs", async () => {
|
|
132
|
+
const result = await safe.all([
|
|
133
|
+
42,
|
|
134
|
+
Promise.resolve("hello"),
|
|
135
|
+
() => true,
|
|
136
|
+
() => Promise.resolve([1, 2, 3]),
|
|
137
|
+
]);
|
|
138
|
+
expect(result).toEqual([42, "hello", true, [1, 2, 3]]);
|
|
139
|
+
});
|
|
140
|
+
it("should never resolve if cancelled", async () => {
|
|
141
|
+
cancelled = true;
|
|
142
|
+
let resolved = false;
|
|
143
|
+
safe.all([Promise.resolve(1)]).then(() => {
|
|
144
|
+
resolved = true;
|
|
145
|
+
});
|
|
146
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
147
|
+
expect(resolved).toBe(false);
|
|
148
|
+
});
|
|
149
|
+
it("should reject if any promise rejects", async () => {
|
|
150
|
+
await expect(safe.all([Promise.resolve(1), Promise.reject(new Error("fail"))])).rejects.toThrow("fail");
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
describe("object syntax", () => {
|
|
154
|
+
it("should resolve all promises with keys", async () => {
|
|
155
|
+
const result = await safe.all({
|
|
156
|
+
a: Promise.resolve(1),
|
|
157
|
+
b: Promise.resolve("two"),
|
|
158
|
+
});
|
|
159
|
+
expect(result).toEqual({ a: 1, b: "two" });
|
|
160
|
+
});
|
|
161
|
+
it("should invoke functions", async () => {
|
|
162
|
+
const result = await safe.all({
|
|
163
|
+
sync: () => 42,
|
|
164
|
+
async: () => Promise.resolve("hello"),
|
|
165
|
+
});
|
|
166
|
+
expect(result).toEqual({ sync: 42, async: "hello" });
|
|
167
|
+
});
|
|
168
|
+
it("should handle mixed inputs", async () => {
|
|
169
|
+
const result = await safe.all({
|
|
170
|
+
value: 1,
|
|
171
|
+
promise: Promise.resolve(2),
|
|
172
|
+
syncFn: () => 3,
|
|
173
|
+
asyncFn: () => Promise.resolve(4),
|
|
174
|
+
});
|
|
175
|
+
expect(result).toEqual({ value: 1, promise: 2, syncFn: 3, asyncFn: 4 });
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe("safe.race", () => {
|
|
180
|
+
describe("array syntax", () => {
|
|
181
|
+
it("should return first resolved value", async () => {
|
|
182
|
+
const fast = Promise.resolve("fast");
|
|
183
|
+
const slow = new Promise((r) => setTimeout(() => r("slow"), 100));
|
|
184
|
+
const result = await safe.race([slow, fast]);
|
|
185
|
+
expect(result).toBe("fast");
|
|
186
|
+
});
|
|
187
|
+
it("should invoke functions", async () => {
|
|
188
|
+
const result = await safe.race([
|
|
189
|
+
() => new Promise((r) => setTimeout(() => r("slow"), 100)),
|
|
190
|
+
() => "fast",
|
|
191
|
+
]);
|
|
192
|
+
expect(result).toBe("fast");
|
|
193
|
+
});
|
|
194
|
+
it("should never resolve if cancelled", async () => {
|
|
195
|
+
cancelled = true;
|
|
196
|
+
let resolved = false;
|
|
197
|
+
safe.race([Promise.resolve(1)]).then(() => {
|
|
198
|
+
resolved = true;
|
|
199
|
+
});
|
|
200
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
201
|
+
expect(resolved).toBe(false);
|
|
202
|
+
});
|
|
203
|
+
});
|
|
204
|
+
describe("object syntax", () => {
|
|
205
|
+
it("should return [key, value] tuple for winner", async () => {
|
|
206
|
+
const fast = Promise.resolve("fast-value");
|
|
207
|
+
const slow = new Promise((r) => setTimeout(() => r("slow-value"), 100));
|
|
208
|
+
const result = await safe.race({
|
|
209
|
+
slow,
|
|
210
|
+
fast,
|
|
211
|
+
});
|
|
212
|
+
expect(result).toEqual(["fast", "fast-value"]);
|
|
213
|
+
});
|
|
214
|
+
it("should invoke functions", async () => {
|
|
215
|
+
const result = await safe.race({
|
|
216
|
+
slow: () => new Promise((r) => setTimeout(() => r("slow"), 100)),
|
|
217
|
+
fast: () => "fast-value",
|
|
218
|
+
});
|
|
219
|
+
expect(result).toEqual(["fast", "fast-value"]);
|
|
220
|
+
});
|
|
221
|
+
});
|
|
222
|
+
});
|
|
223
|
+
describe("safe.settled", () => {
|
|
224
|
+
describe("array syntax", () => {
|
|
225
|
+
it("should return all settled results", async () => {
|
|
226
|
+
const result = await safe.settled([
|
|
227
|
+
Promise.resolve(1),
|
|
228
|
+
Promise.reject(new Error("fail")),
|
|
229
|
+
Promise.resolve(3),
|
|
230
|
+
]);
|
|
231
|
+
expect(result).toHaveLength(3);
|
|
232
|
+
expect(result[0]).toEqual({ status: "fulfilled", value: 1 });
|
|
233
|
+
expect(result[1]).toEqual({
|
|
234
|
+
status: "rejected",
|
|
235
|
+
reason: expect.any(Error),
|
|
236
|
+
});
|
|
237
|
+
expect(result[2]).toEqual({ status: "fulfilled", value: 3 });
|
|
238
|
+
});
|
|
239
|
+
it("should invoke functions", async () => {
|
|
240
|
+
const result = await safe.settled([
|
|
241
|
+
() => 42,
|
|
242
|
+
() => Promise.reject(new Error("oops")),
|
|
243
|
+
]);
|
|
244
|
+
expect(result[0]).toEqual({ status: "fulfilled", value: 42 });
|
|
245
|
+
expect(result[1]).toEqual({
|
|
246
|
+
status: "rejected",
|
|
247
|
+
reason: expect.any(Error),
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
it("should never resolve if cancelled", async () => {
|
|
251
|
+
cancelled = true;
|
|
252
|
+
let resolved = false;
|
|
253
|
+
safe.settled([Promise.resolve(1)]).then(() => {
|
|
254
|
+
resolved = true;
|
|
255
|
+
});
|
|
256
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
257
|
+
expect(resolved).toBe(false);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
describe("object syntax", () => {
|
|
261
|
+
it("should return object with settled results", async () => {
|
|
262
|
+
const result = await safe.settled({
|
|
263
|
+
success: Promise.resolve("ok"),
|
|
264
|
+
fail: Promise.reject(new Error("error")),
|
|
265
|
+
});
|
|
266
|
+
expect(result.success).toEqual({ status: "fulfilled", value: "ok" });
|
|
267
|
+
expect(result.fail).toEqual({
|
|
268
|
+
status: "rejected",
|
|
269
|
+
reason: expect.any(Error),
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
describe("safe.any", () => {
|
|
275
|
+
describe("array syntax", () => {
|
|
276
|
+
it("should return first successful result", async () => {
|
|
277
|
+
const result = await safe.any([
|
|
278
|
+
Promise.reject(new Error("fail1")),
|
|
279
|
+
Promise.resolve("success"),
|
|
280
|
+
Promise.reject(new Error("fail2")),
|
|
281
|
+
]);
|
|
282
|
+
expect(result).toBe("success");
|
|
283
|
+
});
|
|
284
|
+
it("should invoke functions", async () => {
|
|
285
|
+
const result = await safe.any([
|
|
286
|
+
() => Promise.reject(new Error("fail")),
|
|
287
|
+
() => "success",
|
|
288
|
+
]);
|
|
289
|
+
expect(result).toBe("success");
|
|
290
|
+
});
|
|
291
|
+
it("should throw AggregateError if all fail", async () => {
|
|
292
|
+
await expect(safe.any([
|
|
293
|
+
Promise.reject(new Error("fail1")),
|
|
294
|
+
Promise.reject(new Error("fail2")),
|
|
295
|
+
])).rejects.toMatchObject({ name: "AggregateError" });
|
|
296
|
+
});
|
|
297
|
+
it("should never resolve if cancelled", async () => {
|
|
298
|
+
cancelled = true;
|
|
299
|
+
let resolved = false;
|
|
300
|
+
safe.any([Promise.resolve(1)]).then(() => {
|
|
301
|
+
resolved = true;
|
|
302
|
+
});
|
|
303
|
+
await new Promise((r) => setTimeout(r, 50));
|
|
304
|
+
expect(resolved).toBe(false);
|
|
305
|
+
});
|
|
306
|
+
});
|
|
307
|
+
describe("object syntax", () => {
|
|
308
|
+
it("should return [key, value] tuple for first success", async () => {
|
|
309
|
+
const result = await safe.any({
|
|
310
|
+
fail: Promise.reject(new Error("fail")),
|
|
311
|
+
success: Promise.resolve("ok"),
|
|
312
|
+
});
|
|
313
|
+
expect(result).toEqual(["success", "ok"]);
|
|
314
|
+
});
|
|
315
|
+
it("should invoke functions", async () => {
|
|
316
|
+
const result = await safe.any({
|
|
317
|
+
fail: () => Promise.reject(new Error("fail")),
|
|
318
|
+
success: () => "ok",
|
|
319
|
+
});
|
|
320
|
+
expect(result).toEqual(["success", "ok"]);
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
});
|
|
324
|
+
describe("cancellation during execution", () => {
|
|
325
|
+
it("safe.all should not resolve if cancelled during execution", async () => {
|
|
326
|
+
let resolved = false;
|
|
327
|
+
const slowPromise = new Promise((resolve) => {
|
|
328
|
+
setTimeout(() => resolve(42), 50);
|
|
329
|
+
});
|
|
330
|
+
safe.all([slowPromise]).then(() => {
|
|
331
|
+
resolved = true;
|
|
332
|
+
});
|
|
333
|
+
// Cancel while promises are pending
|
|
334
|
+
cancelled = true;
|
|
335
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
336
|
+
expect(resolved).toBe(false);
|
|
337
|
+
});
|
|
338
|
+
it("safe.race should not resolve if cancelled during execution", async () => {
|
|
339
|
+
let resolved = false;
|
|
340
|
+
const slowPromise = new Promise((resolve) => {
|
|
341
|
+
setTimeout(() => resolve(42), 50);
|
|
342
|
+
});
|
|
343
|
+
safe.race([slowPromise]).then(() => {
|
|
344
|
+
resolved = true;
|
|
345
|
+
});
|
|
346
|
+
cancelled = true;
|
|
347
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
348
|
+
expect(resolved).toBe(false);
|
|
349
|
+
});
|
|
350
|
+
});
|
|
351
|
+
describe("safe.callback", () => {
|
|
352
|
+
it("should execute callback if not cancelled", () => {
|
|
353
|
+
const fn = vi.fn();
|
|
354
|
+
const wrapped = safe.callback(fn);
|
|
355
|
+
wrapped("arg1", "arg2");
|
|
356
|
+
expect(fn).toHaveBeenCalledWith("arg1", "arg2");
|
|
357
|
+
});
|
|
358
|
+
it("should not execute callback if cancelled", () => {
|
|
359
|
+
const fn = vi.fn();
|
|
360
|
+
const wrapped = safe.callback(fn);
|
|
361
|
+
cancelled = true;
|
|
362
|
+
wrapped("arg1", "arg2");
|
|
363
|
+
expect(fn).not.toHaveBeenCalled();
|
|
364
|
+
});
|
|
365
|
+
it("should respect cancellation state at call time", () => {
|
|
366
|
+
const fn = vi.fn();
|
|
367
|
+
const wrapped = safe.callback(fn);
|
|
368
|
+
// First call - not cancelled
|
|
369
|
+
wrapped();
|
|
370
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
371
|
+
// Cancel
|
|
372
|
+
cancelled = true;
|
|
373
|
+
// Second call - cancelled
|
|
374
|
+
wrapped();
|
|
375
|
+
expect(fn).toHaveBeenCalledTimes(1); // Still 1, not called again
|
|
376
|
+
});
|
|
377
|
+
it("should work as event handler", () => {
|
|
378
|
+
const handler = vi.fn();
|
|
379
|
+
const safeHandler = safe.callback(handler);
|
|
380
|
+
// Simulate event
|
|
381
|
+
const event = { type: "click" };
|
|
382
|
+
safeHandler(event);
|
|
383
|
+
expect(handler).toHaveBeenCalledWith(event);
|
|
384
|
+
});
|
|
385
|
+
it("should pass through all arguments", () => {
|
|
386
|
+
const fn = vi.fn();
|
|
387
|
+
const wrapped = safe.callback(fn);
|
|
388
|
+
wrapped(1, "two", { three: 3 }, [4]);
|
|
389
|
+
expect(fn).toHaveBeenCalledWith(1, "two", { three: 3 }, [4]);
|
|
390
|
+
});
|
|
391
|
+
});
|
|
392
|
+
describe("safe.delay", () => {
|
|
393
|
+
it("should resolve after specified time", async () => {
|
|
394
|
+
vi.useFakeTimers();
|
|
395
|
+
let resolved = false;
|
|
396
|
+
safe.delay(100).then(() => {
|
|
397
|
+
resolved = true;
|
|
398
|
+
});
|
|
399
|
+
expect(resolved).toBe(false);
|
|
400
|
+
await vi.advanceTimersByTimeAsync(50);
|
|
401
|
+
expect(resolved).toBe(false);
|
|
402
|
+
await vi.advanceTimersByTimeAsync(50);
|
|
403
|
+
expect(resolved).toBe(true);
|
|
404
|
+
vi.useRealTimers();
|
|
405
|
+
});
|
|
406
|
+
it("should resolve with provided value", async () => {
|
|
407
|
+
vi.useFakeTimers();
|
|
408
|
+
const promise = safe.delay(100, "done");
|
|
409
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
410
|
+
const result = await promise;
|
|
411
|
+
expect(result).toBe("done");
|
|
412
|
+
vi.useRealTimers();
|
|
413
|
+
});
|
|
414
|
+
it("should never resolve if cancelled before delay", async () => {
|
|
415
|
+
vi.useFakeTimers();
|
|
416
|
+
cancelled = true;
|
|
417
|
+
let resolved = false;
|
|
418
|
+
safe.delay(100).then(() => {
|
|
419
|
+
resolved = true;
|
|
420
|
+
});
|
|
421
|
+
await vi.advanceTimersByTimeAsync(200);
|
|
422
|
+
expect(resolved).toBe(false);
|
|
423
|
+
vi.useRealTimers();
|
|
424
|
+
});
|
|
425
|
+
it("should never resolve if cancelled during delay", async () => {
|
|
426
|
+
vi.useFakeTimers();
|
|
427
|
+
let resolved = false;
|
|
428
|
+
safe.delay(100).then(() => {
|
|
429
|
+
resolved = true;
|
|
430
|
+
});
|
|
431
|
+
await vi.advanceTimersByTimeAsync(50);
|
|
432
|
+
cancelled = true;
|
|
433
|
+
await vi.advanceTimersByTimeAsync(100);
|
|
434
|
+
expect(resolved).toBe(false);
|
|
435
|
+
vi.useRealTimers();
|
|
436
|
+
});
|
|
437
|
+
it("should resolve with undefined if no value provided", async () => {
|
|
438
|
+
vi.useFakeTimers();
|
|
439
|
+
const promise = safe.delay(50);
|
|
440
|
+
await vi.advanceTimersByTimeAsync(50);
|
|
441
|
+
const result = await promise;
|
|
442
|
+
expect(result).toBe(undefined);
|
|
443
|
+
vi.useRealTimers();
|
|
444
|
+
});
|
|
445
|
+
});
|
|
446
|
+
});
|
|
447
|
+
//# sourceMappingURL=safe.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"safe.test.js","sourceRoot":"","sources":["../../src/async/safe.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for async operations.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert a value, function, or promise-like to a Promise.
|
|
6
|
+
* - If it's already a PromiseLike, return it normalized
|
|
7
|
+
* - If it's a function (with no args), invoke it and convert the result
|
|
8
|
+
* - Otherwise, wrap the value in a Promise
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* toPromise(42) // Promise<42>
|
|
12
|
+
* toPromise(Promise.resolve(1)) // Promise<1>
|
|
13
|
+
* toPromise(() => 42) // Promise<42>
|
|
14
|
+
* toPromise(() => Promise.resolve(1)) // Promise<1>
|
|
15
|
+
*/
|
|
16
|
+
export declare function toPromise<T>(input: T | (() => T) | PromiseLike<T>): Promise<T>;
|
|
17
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/async/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;GAWG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAwB9E"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions for async operations.
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Convert a value, function, or promise-like to a Promise.
|
|
6
|
+
* - If it's already a PromiseLike, return it normalized
|
|
7
|
+
* - If it's a function (with no args), invoke it and convert the result
|
|
8
|
+
* - Otherwise, wrap the value in a Promise
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* toPromise(42) // Promise<42>
|
|
12
|
+
* toPromise(Promise.resolve(1)) // Promise<1>
|
|
13
|
+
* toPromise(() => 42) // Promise<42>
|
|
14
|
+
* toPromise(() => Promise.resolve(1)) // Promise<1>
|
|
15
|
+
*/
|
|
16
|
+
export function toPromise(input) {
|
|
17
|
+
// If it's already a PromiseLike, normalize it
|
|
18
|
+
if (input !== null &&
|
|
19
|
+
typeof input === "object" &&
|
|
20
|
+
"then" in input &&
|
|
21
|
+
typeof input.then === "function") {
|
|
22
|
+
return Promise.resolve(input);
|
|
23
|
+
}
|
|
24
|
+
// If it's a function, invoke it and convert the result
|
|
25
|
+
if (typeof input === "function") {
|
|
26
|
+
try {
|
|
27
|
+
const result = input();
|
|
28
|
+
// Recursively convert the result (handles nested functions)
|
|
29
|
+
return toPromise(result);
|
|
30
|
+
}
|
|
31
|
+
catch (error) {
|
|
32
|
+
return Promise.reject(error);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// Otherwise, wrap the value in a Promise
|
|
36
|
+
return Promise.resolve(input);
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/async/utils.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,SAAS,CAAI,KAAqC;IAChE,8CAA8C;IAC9C,IACE,KAAK,KAAK,IAAI;QACd,OAAO,KAAK,KAAK,QAAQ;QACzB,MAAM,IAAI,KAAK;QACf,OAAQ,KAAa,CAAC,IAAI,KAAK,UAAU,EACzC,CAAC;QACD,OAAO,OAAO,CAAC,OAAO,CAAC,KAAuB,CAAC,CAAC;IAClD,CAAC;IAED,uDAAuD;IACvD,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,MAAM,GAAI,KAAkC,EAAE,CAAC;YACrD,4DAA4D;YAC5D,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,yCAAyC;IACzC,OAAO,OAAO,CAAC,OAAO,CAAC,KAAU,CAAC,CAAC;AACrC,CAAC"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Promise utilities for waiting on async values.
|
|
3
|
+
*
|
|
4
|
+
* Works with Promise<T>, PromiseLike<T> (including Action<T>).
|
|
5
|
+
* Returns Promises - use with `await`.
|
|
6
|
+
*
|
|
7
|
+
* For Suspense mode with Signals, use `read` instead.
|
|
8
|
+
*/
|
|
9
|
+
/** Input can be Promise or PromiseLike (including Action) */
|
|
10
|
+
type Awaitable<T> = PromiseLike<T>;
|
|
11
|
+
/** Extract the resolved type from an Awaitable */
|
|
12
|
+
type AwaitedValue<T> = T extends PromiseLike<infer U> ? U : never;
|
|
13
|
+
/** Array of awaitables */
|
|
14
|
+
type ArrayInput = readonly Awaitable<any>[];
|
|
15
|
+
/** Object of awaitables */
|
|
16
|
+
type ObjectInput = Record<string, Awaitable<any>>;
|
|
17
|
+
/** Result type for array input - preserves tuple structure */
|
|
18
|
+
type ArrayResult<T extends ArrayInput> = {
|
|
19
|
+
[K in keyof T]: AwaitedValue<T[K]>;
|
|
20
|
+
};
|
|
21
|
+
/** Result type for object input */
|
|
22
|
+
type ObjectResult<T extends ObjectInput> = {
|
|
23
|
+
[K in keyof T]: AwaitedValue<T[K]>;
|
|
24
|
+
};
|
|
25
|
+
/** Result type for array race */
|
|
26
|
+
type RaceArrayResult<T extends ArrayInput> = AwaitedValue<T[number]>;
|
|
27
|
+
/** Result type for object race - [winner, value] tuple */
|
|
28
|
+
type RaceObjectResult<T extends ObjectInput> = {
|
|
29
|
+
[K in keyof T]: [K, AwaitedValue<T[K]>];
|
|
30
|
+
}[keyof T];
|
|
31
|
+
/** Result type for array settled */
|
|
32
|
+
type SettledArrayResult<T extends ArrayInput> = {
|
|
33
|
+
[K in keyof T]: PromiseSettledResult<AwaitedValue<T[K]>>;
|
|
34
|
+
};
|
|
35
|
+
/** Result type for object settled */
|
|
36
|
+
type SettledObjectResult<T extends ObjectInput> = {
|
|
37
|
+
[K in keyof T]: PromiseSettledResult<AwaitedValue<T[K]>>;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* Waits for a PromiseLike to resolve, returning a Promise.
|
|
41
|
+
* Works with Promise, Action, or any thenable.
|
|
42
|
+
*
|
|
43
|
+
* @param input - Promise or PromiseLike (including Action)
|
|
44
|
+
* @returns Promise that resolves with the value
|
|
45
|
+
*
|
|
46
|
+
* @example
|
|
47
|
+
* // With Promise
|
|
48
|
+
* const data = await wait(fetchData());
|
|
49
|
+
*
|
|
50
|
+
* @example
|
|
51
|
+
* // With Action (thenable)
|
|
52
|
+
* const payload = await wait(onUserReady);
|
|
53
|
+
*/
|
|
54
|
+
export declare function wait<T>(input: Awaitable<T>): Promise<T>;
|
|
55
|
+
export declare namespace wait {
|
|
56
|
+
/**
|
|
57
|
+
* Waits for all inputs to resolve, returns array or object of values.
|
|
58
|
+
*
|
|
59
|
+
* @example
|
|
60
|
+
* // Array form
|
|
61
|
+
* const [user, config] = await wait.all([userPromise, configAction]);
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* // Object form
|
|
65
|
+
* const { user, config } = await wait.all({ user: userPromise, config: configAction });
|
|
66
|
+
*/
|
|
67
|
+
function all<const T extends ArrayInput>(inputs: T): Promise<ArrayResult<T>>;
|
|
68
|
+
function all<const T extends ObjectInput>(inputs: T): Promise<ObjectResult<T>>;
|
|
69
|
+
}
|
|
70
|
+
export declare namespace wait {
|
|
71
|
+
/**
|
|
72
|
+
* Waits for first input to settle, returns its value (or throws its error).
|
|
73
|
+
*
|
|
74
|
+
* @example
|
|
75
|
+
* // Array form - returns first resolved value
|
|
76
|
+
* const result = await wait.race([fastPromise, slowAction]);
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* // Object form - returns [winner, value] tuple
|
|
80
|
+
* const [winner, value] = await wait.race({ data: fetchPromise, cancel: onCancel });
|
|
81
|
+
* if (winner === 'cancel') { ... }
|
|
82
|
+
*/
|
|
83
|
+
function race<const T extends ArrayInput>(inputs: T): Promise<RaceArrayResult<T>>;
|
|
84
|
+
function race<const T extends ObjectInput>(inputs: T): Promise<RaceObjectResult<T>>;
|
|
85
|
+
}
|
|
86
|
+
export declare namespace wait {
|
|
87
|
+
/**
|
|
88
|
+
* Waits for all inputs to settle (resolve or reject).
|
|
89
|
+
* Returns PromiseSettledResult objects.
|
|
90
|
+
*
|
|
91
|
+
* @example
|
|
92
|
+
* // Array form
|
|
93
|
+
* const results = await wait.settled([promise1, action2]);
|
|
94
|
+
* // [{ status: 'fulfilled', value: ... }, { status: 'rejected', reason: ... }]
|
|
95
|
+
*
|
|
96
|
+
* @example
|
|
97
|
+
* // Object form
|
|
98
|
+
* const results = await wait.settled({ a: promise1, b: action2 });
|
|
99
|
+
*/
|
|
100
|
+
function settled<const T extends ArrayInput>(inputs: T): Promise<SettledArrayResult<T>>;
|
|
101
|
+
function settled<const T extends ObjectInput>(inputs: T): Promise<SettledObjectResult<T>>;
|
|
102
|
+
}
|
|
103
|
+
export declare namespace wait {
|
|
104
|
+
/**
|
|
105
|
+
* Waits for first input to resolve successfully.
|
|
106
|
+
* If ALL reject, throws AggregateError.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* // Array form - returns first successful value
|
|
110
|
+
* const result = await wait.any([primaryPromise, fallbackAction]);
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* // Object form - returns [winner, value] tuple
|
|
114
|
+
* const [winner, value] = await wait.any({ primary: primaryPromise, fallback: fallbackAction });
|
|
115
|
+
*/
|
|
116
|
+
function any<const T extends ArrayInput>(inputs: T): Promise<RaceArrayResult<T>>;
|
|
117
|
+
function any<const T extends ObjectInput>(inputs: T): Promise<RaceObjectResult<T>>;
|
|
118
|
+
}
|
|
119
|
+
export {};
|
|
120
|
+
//# sourceMappingURL=wait.d.ts.map
|