@satoshibits/functional 1.1.2 → 1.1.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/package.json +12 -13
- package/dist/array-utils.test.d.ts +0 -2
- package/dist/array-utils.test.d.ts.map +0 -1
- package/dist/array-utils.test.js +0 -256
- package/dist/array-utils.test.js.map +0 -1
- package/dist/composition.test.d.ts +0 -2
- package/dist/composition.test.d.ts.map +0 -1
- package/dist/composition.test.js +0 -409
- package/dist/composition.test.js.map +0 -1
- package/dist/integration.test.d.mts +0 -2
- package/dist/integration.test.d.mts.map +0 -1
- package/dist/integration.test.mjs +0 -486
- package/dist/integration.test.mjs.map +0 -1
- package/dist/io.test.d.mts +0 -2
- package/dist/io.test.d.mts.map +0 -1
- package/dist/io.test.mjs +0 -373
- package/dist/io.test.mjs.map +0 -1
- package/dist/laws.test.d.mts +0 -2
- package/dist/laws.test.d.mts.map +0 -1
- package/dist/laws.test.mjs +0 -614
- package/dist/laws.test.mjs.map +0 -1
- package/dist/object-utils.test.d.ts +0 -2
- package/dist/object-utils.test.d.ts.map +0 -1
- package/dist/object-utils.test.js +0 -286
- package/dist/object-utils.test.js.map +0 -1
- package/dist/option-additions.test.d.mts +0 -2
- package/dist/option-additions.test.d.mts.map +0 -1
- package/dist/option-additions.test.mjs +0 -325
- package/dist/option-additions.test.mjs.map +0 -1
- package/dist/option.test.d.ts +0 -6
- package/dist/option.test.d.ts.map +0 -1
- package/dist/option.test.js +0 -606
- package/dist/option.test.js.map +0 -1
- package/dist/performance.test.d.ts +0 -2
- package/dist/performance.test.d.ts.map +0 -1
- package/dist/performance.test.js +0 -424
- package/dist/performance.test.js.map +0 -1
- package/dist/pipeline.test.d.ts +0 -2
- package/dist/pipeline.test.d.ts.map +0 -1
- package/dist/pipeline.test.js +0 -445
- package/dist/pipeline.test.js.map +0 -1
- package/dist/predicates.test.d.ts +0 -2
- package/dist/predicates.test.d.ts.map +0 -1
- package/dist/predicates.test.js +0 -375
- package/dist/predicates.test.js.map +0 -1
- package/dist/reader-result.test.d.ts +0 -2
- package/dist/reader-result.test.d.ts.map +0 -1
- package/dist/reader-result.test.js +0 -1259
- package/dist/reader-result.test.js.map +0 -1
- package/dist/reader.test.d.mts +0 -2
- package/dist/reader.test.d.mts.map +0 -1
- package/dist/reader.test.mjs +0 -288
- package/dist/reader.test.mjs.map +0 -1
- package/dist/result-additions.test.d.mts +0 -2
- package/dist/result-additions.test.d.mts.map +0 -1
- package/dist/result-additions.test.mjs +0 -325
- package/dist/result-additions.test.mjs.map +0 -1
- package/dist/result.test.d.ts +0 -2
- package/dist/result.test.d.ts.map +0 -1
- package/dist/result.test.js +0 -453
- package/dist/result.test.js.map +0 -1
- package/dist/task.test.d.mts +0 -2
- package/dist/task.test.d.mts.map +0 -1
- package/dist/task.test.mjs +0 -1006
- package/dist/task.test.mjs.map +0 -1
- package/dist/types.test.d.ts +0 -6
- package/dist/types.test.d.ts.map +0 -1
- package/dist/types.test.js +0 -447
- package/dist/types.test.js.map +0 -1
- package/dist/validation.test.d.ts +0 -2
- package/dist/validation.test.d.ts.map +0 -1
- package/dist/validation.test.js +0 -518
- package/dist/validation.test.js.map +0 -1
|
@@ -1,1259 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
14
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
15
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
16
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
17
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
18
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
19
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
20
|
-
});
|
|
21
|
-
};
|
|
22
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
23
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
|
|
24
|
-
return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
25
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
26
|
-
function step(op) {
|
|
27
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
28
|
-
while (g && (g = 0, op[0] && (_ = 0)), _) try {
|
|
29
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
30
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
31
|
-
switch (op[0]) {
|
|
32
|
-
case 0: case 1: t = op; break;
|
|
33
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
34
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
35
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
36
|
-
default:
|
|
37
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
38
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
39
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
40
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
41
|
-
if (t[2]) _.ops.pop();
|
|
42
|
-
_.trys.pop(); continue;
|
|
43
|
-
}
|
|
44
|
-
op = body.call(thisArg, _);
|
|
45
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
46
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
47
|
-
}
|
|
48
|
-
};
|
|
49
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
50
|
-
var vitest_1 = require("vitest");
|
|
51
|
-
var reader_result_mjs_1 = require("./reader-result.mjs");
|
|
52
|
-
var result_mjs_1 = require("./result.mjs");
|
|
53
|
-
(0, vitest_1.describe)('ReaderResult', function () {
|
|
54
|
-
var mockDeps = {
|
|
55
|
-
db: {
|
|
56
|
-
findUser: vitest_1.vi.fn(),
|
|
57
|
-
saveUser: vitest_1.vi.fn(),
|
|
58
|
-
},
|
|
59
|
-
logger: {
|
|
60
|
-
log: vitest_1.vi.fn(),
|
|
61
|
-
},
|
|
62
|
-
};
|
|
63
|
-
(0, vitest_1.beforeEach)(function () {
|
|
64
|
-
vitest_1.vi.clearAllMocks();
|
|
65
|
-
});
|
|
66
|
-
(0, vitest_1.describe)('of', function () {
|
|
67
|
-
(0, vitest_1.it)('creates a successful ReaderResult', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
68
|
-
var rr, result;
|
|
69
|
-
return __generator(this, function (_a) {
|
|
70
|
-
switch (_a.label) {
|
|
71
|
-
case 0:
|
|
72
|
-
rr = reader_result_mjs_1.ReaderResult.of(42);
|
|
73
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
74
|
-
case 1:
|
|
75
|
-
result = _a.sent();
|
|
76
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
77
|
-
return [2 /*return*/];
|
|
78
|
-
}
|
|
79
|
-
});
|
|
80
|
-
}); });
|
|
81
|
-
});
|
|
82
|
-
(0, vitest_1.describe)('fail', function () {
|
|
83
|
-
(0, vitest_1.it)('creates a failed ReaderResult', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
84
|
-
var rr, result;
|
|
85
|
-
return __generator(this, function (_a) {
|
|
86
|
-
switch (_a.label) {
|
|
87
|
-
case 0:
|
|
88
|
-
rr = reader_result_mjs_1.ReaderResult.fail('error');
|
|
89
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
90
|
-
case 1:
|
|
91
|
-
result = _a.sent();
|
|
92
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
93
|
-
return [2 /*return*/];
|
|
94
|
-
}
|
|
95
|
-
});
|
|
96
|
-
}); });
|
|
97
|
-
});
|
|
98
|
-
(0, vitest_1.describe)('chain', function () {
|
|
99
|
-
(0, vitest_1.it)('chains successful operations', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
100
|
-
var rr, result;
|
|
101
|
-
return __generator(this, function (_a) {
|
|
102
|
-
switch (_a.label) {
|
|
103
|
-
case 0:
|
|
104
|
-
rr = reader_result_mjs_1.ReaderResult.chain(function (x) {
|
|
105
|
-
return reader_result_mjs_1.ReaderResult.of(x * 2);
|
|
106
|
-
})(reader_result_mjs_1.ReaderResult.of(5));
|
|
107
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
108
|
-
case 1:
|
|
109
|
-
result = _a.sent();
|
|
110
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 10 });
|
|
111
|
-
return [2 /*return*/];
|
|
112
|
-
}
|
|
113
|
-
});
|
|
114
|
-
}); });
|
|
115
|
-
(0, vitest_1.it)('short-circuits on error', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
116
|
-
var rr, result;
|
|
117
|
-
return __generator(this, function (_a) {
|
|
118
|
-
switch (_a.label) {
|
|
119
|
-
case 0:
|
|
120
|
-
rr = reader_result_mjs_1.ReaderResult.chain(function (x) {
|
|
121
|
-
return reader_result_mjs_1.ReaderResult.of(x * 2);
|
|
122
|
-
})(reader_result_mjs_1.ReaderResult.fail('error'));
|
|
123
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
124
|
-
case 1:
|
|
125
|
-
result = _a.sent();
|
|
126
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
127
|
-
return [2 /*return*/];
|
|
128
|
-
}
|
|
129
|
-
});
|
|
130
|
-
}); });
|
|
131
|
-
(0, vitest_1.it)('propagates errors from chained function', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
132
|
-
var rr, result;
|
|
133
|
-
return __generator(this, function (_a) {
|
|
134
|
-
switch (_a.label) {
|
|
135
|
-
case 0:
|
|
136
|
-
rr = reader_result_mjs_1.ReaderResult.chain(function () {
|
|
137
|
-
return reader_result_mjs_1.ReaderResult.fail('chained error');
|
|
138
|
-
})(reader_result_mjs_1.ReaderResult.of(5));
|
|
139
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
140
|
-
case 1:
|
|
141
|
-
result = _a.sent();
|
|
142
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'chained error' });
|
|
143
|
-
return [2 /*return*/];
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
}); });
|
|
147
|
-
});
|
|
148
|
-
(0, vitest_1.describe)('map', function () {
|
|
149
|
-
(0, vitest_1.it)('transforms successful values', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
150
|
-
var rr, result;
|
|
151
|
-
return __generator(this, function (_a) {
|
|
152
|
-
switch (_a.label) {
|
|
153
|
-
case 0:
|
|
154
|
-
rr = reader_result_mjs_1.ReaderResult.map(function (x) { return x * 2; })(reader_result_mjs_1.ReaderResult.of(5));
|
|
155
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
156
|
-
case 1:
|
|
157
|
-
result = _a.sent();
|
|
158
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 10 });
|
|
159
|
-
return [2 /*return*/];
|
|
160
|
-
}
|
|
161
|
-
});
|
|
162
|
-
}); });
|
|
163
|
-
(0, vitest_1.it)('passes through errors', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
164
|
-
var rr, result;
|
|
165
|
-
return __generator(this, function (_a) {
|
|
166
|
-
switch (_a.label) {
|
|
167
|
-
case 0:
|
|
168
|
-
rr = reader_result_mjs_1.ReaderResult.map(function (x) { return x * 2; })(reader_result_mjs_1.ReaderResult.fail('error'));
|
|
169
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
170
|
-
case 1:
|
|
171
|
-
result = _a.sent();
|
|
172
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
173
|
-
return [2 /*return*/];
|
|
174
|
-
}
|
|
175
|
-
});
|
|
176
|
-
}); });
|
|
177
|
-
});
|
|
178
|
-
(0, vitest_1.describe)('mapError', function () {
|
|
179
|
-
(0, vitest_1.it)('transforms error values', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
180
|
-
var rr, result;
|
|
181
|
-
return __generator(this, function (_a) {
|
|
182
|
-
switch (_a.label) {
|
|
183
|
-
case 0:
|
|
184
|
-
rr = reader_result_mjs_1.ReaderResult.mapError(function (e) { return e.toUpperCase(); })(reader_result_mjs_1.ReaderResult.fail('error'));
|
|
185
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
186
|
-
case 1:
|
|
187
|
-
result = _a.sent();
|
|
188
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'ERROR' });
|
|
189
|
-
return [2 /*return*/];
|
|
190
|
-
}
|
|
191
|
-
});
|
|
192
|
-
}); });
|
|
193
|
-
(0, vitest_1.it)('passes through successful values', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
194
|
-
var rr, result;
|
|
195
|
-
return __generator(this, function (_a) {
|
|
196
|
-
switch (_a.label) {
|
|
197
|
-
case 0:
|
|
198
|
-
rr = reader_result_mjs_1.ReaderResult.mapError(function (e) { return e.toUpperCase(); })(reader_result_mjs_1.ReaderResult.of(42));
|
|
199
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
200
|
-
case 1:
|
|
201
|
-
result = _a.sent();
|
|
202
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
203
|
-
return [2 /*return*/];
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
}); });
|
|
207
|
-
});
|
|
208
|
-
(0, vitest_1.describe)('ask', function () {
|
|
209
|
-
(0, vitest_1.it)('returns the dependencies', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
210
|
-
var rr, result;
|
|
211
|
-
return __generator(this, function (_a) {
|
|
212
|
-
switch (_a.label) {
|
|
213
|
-
case 0:
|
|
214
|
-
rr = reader_result_mjs_1.ReaderResult.ask();
|
|
215
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
216
|
-
case 1:
|
|
217
|
-
result = _a.sent();
|
|
218
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: mockDeps });
|
|
219
|
-
return [2 /*return*/];
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
}); });
|
|
223
|
-
});
|
|
224
|
-
(0, vitest_1.describe)('asks', function () {
|
|
225
|
-
(0, vitest_1.it)('returns a part of the dependencies', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
226
|
-
var rr, result;
|
|
227
|
-
return __generator(this, function (_a) {
|
|
228
|
-
switch (_a.label) {
|
|
229
|
-
case 0:
|
|
230
|
-
rr = reader_result_mjs_1.ReaderResult.asks(function (deps) { return deps.db; });
|
|
231
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
232
|
-
case 1:
|
|
233
|
-
result = _a.sent();
|
|
234
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: mockDeps.db });
|
|
235
|
-
return [2 /*return*/];
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
}); });
|
|
239
|
-
});
|
|
240
|
-
(0, vitest_1.describe)('fromResult', function () {
|
|
241
|
-
(0, vitest_1.it)('lifts a successful Result', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
242
|
-
var rr, result;
|
|
243
|
-
return __generator(this, function (_a) {
|
|
244
|
-
switch (_a.label) {
|
|
245
|
-
case 0:
|
|
246
|
-
rr = reader_result_mjs_1.ReaderResult.fromResult(result_mjs_1.Result.ok(42));
|
|
247
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
248
|
-
case 1:
|
|
249
|
-
result = _a.sent();
|
|
250
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
251
|
-
return [2 /*return*/];
|
|
252
|
-
}
|
|
253
|
-
});
|
|
254
|
-
}); });
|
|
255
|
-
(0, vitest_1.it)('lifts a failed Result', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
256
|
-
var rr, result;
|
|
257
|
-
return __generator(this, function (_a) {
|
|
258
|
-
switch (_a.label) {
|
|
259
|
-
case 0:
|
|
260
|
-
rr = reader_result_mjs_1.ReaderResult.fromResult(result_mjs_1.Result.err('error'));
|
|
261
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
262
|
-
case 1:
|
|
263
|
-
result = _a.sent();
|
|
264
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
265
|
-
return [2 /*return*/];
|
|
266
|
-
}
|
|
267
|
-
});
|
|
268
|
-
}); });
|
|
269
|
-
});
|
|
270
|
-
(0, vitest_1.describe)('tryCatch', function () {
|
|
271
|
-
(0, vitest_1.it)('wraps successful async operations', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
272
|
-
var rr, result;
|
|
273
|
-
return __generator(this, function (_a) {
|
|
274
|
-
switch (_a.label) {
|
|
275
|
-
case 0:
|
|
276
|
-
rr = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.resolve(42); }, function (error) { return String(error); });
|
|
277
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
278
|
-
case 1:
|
|
279
|
-
result = _a.sent();
|
|
280
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
281
|
-
return [2 /*return*/];
|
|
282
|
-
}
|
|
283
|
-
});
|
|
284
|
-
}); });
|
|
285
|
-
(0, vitest_1.it)('catches exceptions and converts to errors', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
286
|
-
var rr, result;
|
|
287
|
-
return __generator(this, function (_a) {
|
|
288
|
-
switch (_a.label) {
|
|
289
|
-
case 0:
|
|
290
|
-
rr = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.reject(new Error('async error')); }, function (error) { return error instanceof Error ? error.message : 'unknown'; });
|
|
291
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
292
|
-
case 1:
|
|
293
|
-
result = _a.sent();
|
|
294
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'async error' });
|
|
295
|
-
return [2 /*return*/];
|
|
296
|
-
}
|
|
297
|
-
});
|
|
298
|
-
}); });
|
|
299
|
-
(0, vitest_1.it)('catches non-Error exceptions', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
300
|
-
var rr, result;
|
|
301
|
-
return __generator(this, function (_a) {
|
|
302
|
-
switch (_a.label) {
|
|
303
|
-
case 0:
|
|
304
|
-
rr = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.reject(new Error('a string error')); }, function (error) { return error instanceof Error ? error.message : String(error); });
|
|
305
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
306
|
-
case 1:
|
|
307
|
-
result = _a.sent();
|
|
308
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'a string error' });
|
|
309
|
-
return [2 /*return*/];
|
|
310
|
-
}
|
|
311
|
-
});
|
|
312
|
-
}); });
|
|
313
|
-
(0, vitest_1.it)('has access to dependencies', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
314
|
-
var rr, result;
|
|
315
|
-
return __generator(this, function (_a) {
|
|
316
|
-
switch (_a.label) {
|
|
317
|
-
case 0:
|
|
318
|
-
vitest_1.vi.mocked(mockDeps.db.findUser).mockResolvedValue({ id: '1', name: 'John' });
|
|
319
|
-
rr = reader_result_mjs_1.ReaderResult.tryCatch(function (deps) { return __awaiter(void 0, void 0, void 0, function () {
|
|
320
|
-
var user;
|
|
321
|
-
return __generator(this, function (_a) {
|
|
322
|
-
switch (_a.label) {
|
|
323
|
-
case 0: return [4 /*yield*/, deps.db.findUser('1')];
|
|
324
|
-
case 1:
|
|
325
|
-
user = _a.sent();
|
|
326
|
-
if (!user)
|
|
327
|
-
throw new Error('User not found');
|
|
328
|
-
return [2 /*return*/, user];
|
|
329
|
-
}
|
|
330
|
-
});
|
|
331
|
-
}); }, function (error) { return String(error); });
|
|
332
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
333
|
-
case 1:
|
|
334
|
-
result = _a.sent();
|
|
335
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: { id: '1', name: 'John' } });
|
|
336
|
-
(0, vitest_1.expect)(mockDeps.db.findUser).toHaveBeenCalledWith('1');
|
|
337
|
-
return [2 /*return*/];
|
|
338
|
-
}
|
|
339
|
-
});
|
|
340
|
-
}); });
|
|
341
|
-
});
|
|
342
|
-
(0, vitest_1.describe)('zip', function () {
|
|
343
|
-
(0, vitest_1.beforeEach)(function () {
|
|
344
|
-
vitest_1.vi.useFakeTimers();
|
|
345
|
-
});
|
|
346
|
-
(0, vitest_1.afterEach)(function () {
|
|
347
|
-
vitest_1.vi.useRealTimers();
|
|
348
|
-
});
|
|
349
|
-
(0, vitest_1.it)('combines two successful ReaderResults', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
350
|
-
var rr1, rr2, zipped, result;
|
|
351
|
-
return __generator(this, function (_a) {
|
|
352
|
-
switch (_a.label) {
|
|
353
|
-
case 0:
|
|
354
|
-
rr1 = reader_result_mjs_1.ReaderResult.of(5);
|
|
355
|
-
rr2 = reader_result_mjs_1.ReaderResult.of('hello');
|
|
356
|
-
zipped = reader_result_mjs_1.ReaderResult.zip(rr1, rr2);
|
|
357
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(zipped)];
|
|
358
|
-
case 1:
|
|
359
|
-
result = _a.sent();
|
|
360
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: [5, 'hello'] });
|
|
361
|
-
return [2 /*return*/];
|
|
362
|
-
}
|
|
363
|
-
});
|
|
364
|
-
}); });
|
|
365
|
-
(0, vitest_1.it)('returns first error when first fails', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
366
|
-
var rr1, rr2, zipped, result;
|
|
367
|
-
return __generator(this, function (_a) {
|
|
368
|
-
switch (_a.label) {
|
|
369
|
-
case 0:
|
|
370
|
-
rr1 = reader_result_mjs_1.ReaderResult.fail('error1');
|
|
371
|
-
rr2 = reader_result_mjs_1.ReaderResult.of('hello');
|
|
372
|
-
zipped = reader_result_mjs_1.ReaderResult.zip(rr1, rr2);
|
|
373
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(zipped)];
|
|
374
|
-
case 1:
|
|
375
|
-
result = _a.sent();
|
|
376
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error1' });
|
|
377
|
-
return [2 /*return*/];
|
|
378
|
-
}
|
|
379
|
-
});
|
|
380
|
-
}); });
|
|
381
|
-
(0, vitest_1.it)('returns second error when second fails', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
382
|
-
var rr1, rr2, zipped, result;
|
|
383
|
-
return __generator(this, function (_a) {
|
|
384
|
-
switch (_a.label) {
|
|
385
|
-
case 0:
|
|
386
|
-
rr1 = reader_result_mjs_1.ReaderResult.of(5);
|
|
387
|
-
rr2 = reader_result_mjs_1.ReaderResult.fail('error2');
|
|
388
|
-
zipped = reader_result_mjs_1.ReaderResult.zip(rr1, rr2);
|
|
389
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(zipped)];
|
|
390
|
-
case 1:
|
|
391
|
-
result = _a.sent();
|
|
392
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error2' });
|
|
393
|
-
return [2 /*return*/];
|
|
394
|
-
}
|
|
395
|
-
});
|
|
396
|
-
}); });
|
|
397
|
-
(0, vitest_1.it)('runs in parallel', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
398
|
-
var rr1, rr2, zipped, promise, result;
|
|
399
|
-
return __generator(this, function (_a) {
|
|
400
|
-
switch (_a.label) {
|
|
401
|
-
case 0:
|
|
402
|
-
rr1 = reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
403
|
-
return __generator(this, function (_a) {
|
|
404
|
-
switch (_a.label) {
|
|
405
|
-
case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 50); })];
|
|
406
|
-
case 1:
|
|
407
|
-
_a.sent();
|
|
408
|
-
return [2 /*return*/, 1];
|
|
409
|
-
}
|
|
410
|
-
});
|
|
411
|
-
}); }, function () { return 'error'; });
|
|
412
|
-
rr2 = reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
413
|
-
return __generator(this, function (_a) {
|
|
414
|
-
switch (_a.label) {
|
|
415
|
-
case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 50); })];
|
|
416
|
-
case 1:
|
|
417
|
-
_a.sent();
|
|
418
|
-
return [2 /*return*/, 2];
|
|
419
|
-
}
|
|
420
|
-
});
|
|
421
|
-
}); }, function () { return 'error'; });
|
|
422
|
-
zipped = reader_result_mjs_1.ReaderResult.zip(rr1, rr2);
|
|
423
|
-
promise = reader_result_mjs_1.ReaderResult.run(mockDeps)(zipped);
|
|
424
|
-
// both operations run in parallel - advance time once by 50ms
|
|
425
|
-
return [4 /*yield*/, vitest_1.vi.advanceTimersByTimeAsync(50)];
|
|
426
|
-
case 1:
|
|
427
|
-
// both operations run in parallel - advance time once by 50ms
|
|
428
|
-
_a.sent();
|
|
429
|
-
return [4 /*yield*/, promise];
|
|
430
|
-
case 2:
|
|
431
|
-
result = _a.sent();
|
|
432
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: [1, 2] });
|
|
433
|
-
return [2 /*return*/];
|
|
434
|
-
}
|
|
435
|
-
});
|
|
436
|
-
}); });
|
|
437
|
-
});
|
|
438
|
-
(0, vitest_1.describe)('sequence', function () {
|
|
439
|
-
(0, vitest_1.beforeEach)(function () {
|
|
440
|
-
vitest_1.vi.useFakeTimers();
|
|
441
|
-
});
|
|
442
|
-
(0, vitest_1.afterEach)(function () {
|
|
443
|
-
vitest_1.vi.useRealTimers();
|
|
444
|
-
});
|
|
445
|
-
(0, vitest_1.it)('sequences all successful ReaderResults', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
446
|
-
var rrs, sequenced, result;
|
|
447
|
-
return __generator(this, function (_a) {
|
|
448
|
-
switch (_a.label) {
|
|
449
|
-
case 0:
|
|
450
|
-
rrs = [
|
|
451
|
-
reader_result_mjs_1.ReaderResult.of(1),
|
|
452
|
-
reader_result_mjs_1.ReaderResult.of(2),
|
|
453
|
-
reader_result_mjs_1.ReaderResult.of(3),
|
|
454
|
-
];
|
|
455
|
-
sequenced = reader_result_mjs_1.ReaderResult.sequence(rrs);
|
|
456
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(sequenced)];
|
|
457
|
-
case 1:
|
|
458
|
-
result = _a.sent();
|
|
459
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: [1, 2, 3] });
|
|
460
|
-
return [2 /*return*/];
|
|
461
|
-
}
|
|
462
|
-
});
|
|
463
|
-
}); });
|
|
464
|
-
(0, vitest_1.it)('returns first error on failure', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
465
|
-
var rrs, sequenced, result;
|
|
466
|
-
return __generator(this, function (_a) {
|
|
467
|
-
switch (_a.label) {
|
|
468
|
-
case 0:
|
|
469
|
-
rrs = [
|
|
470
|
-
reader_result_mjs_1.ReaderResult.of(1),
|
|
471
|
-
reader_result_mjs_1.ReaderResult.fail('error'),
|
|
472
|
-
reader_result_mjs_1.ReaderResult.of(3),
|
|
473
|
-
];
|
|
474
|
-
sequenced = reader_result_mjs_1.ReaderResult.sequence(rrs);
|
|
475
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(sequenced)];
|
|
476
|
-
case 1:
|
|
477
|
-
result = _a.sent();
|
|
478
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
479
|
-
return [2 /*return*/];
|
|
480
|
-
}
|
|
481
|
-
});
|
|
482
|
-
}); });
|
|
483
|
-
(0, vitest_1.it)('works with empty array', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
484
|
-
var rrs, sequenced, result;
|
|
485
|
-
return __generator(this, function (_a) {
|
|
486
|
-
switch (_a.label) {
|
|
487
|
-
case 0:
|
|
488
|
-
rrs = [];
|
|
489
|
-
sequenced = reader_result_mjs_1.ReaderResult.sequence(rrs);
|
|
490
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(sequenced)];
|
|
491
|
-
case 1:
|
|
492
|
-
result = _a.sent();
|
|
493
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: [] });
|
|
494
|
-
return [2 /*return*/];
|
|
495
|
-
}
|
|
496
|
-
});
|
|
497
|
-
}); });
|
|
498
|
-
(0, vitest_1.it)('runs in sequence, not in parallel', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
499
|
-
var executionOrder, rrs, sequenced, promise, result;
|
|
500
|
-
return __generator(this, function (_a) {
|
|
501
|
-
switch (_a.label) {
|
|
502
|
-
case 0:
|
|
503
|
-
executionOrder = [];
|
|
504
|
-
rrs = [
|
|
505
|
-
reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
506
|
-
return __generator(this, function (_a) {
|
|
507
|
-
switch (_a.label) {
|
|
508
|
-
case 0: return [4 /*yield*/, new Promise(function (res) { return setTimeout(res, 30); })];
|
|
509
|
-
case 1:
|
|
510
|
-
_a.sent();
|
|
511
|
-
executionOrder.push(1);
|
|
512
|
-
return [2 /*return*/, 1];
|
|
513
|
-
}
|
|
514
|
-
});
|
|
515
|
-
}); }, function () { return 'error'; }),
|
|
516
|
-
reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
517
|
-
return __generator(this, function (_a) {
|
|
518
|
-
switch (_a.label) {
|
|
519
|
-
case 0: return [4 /*yield*/, new Promise(function (res) { return setTimeout(res, 10); })];
|
|
520
|
-
case 1:
|
|
521
|
-
_a.sent();
|
|
522
|
-
executionOrder.push(2);
|
|
523
|
-
return [2 /*return*/, 2];
|
|
524
|
-
}
|
|
525
|
-
});
|
|
526
|
-
}); }, function () { return 'error'; }),
|
|
527
|
-
];
|
|
528
|
-
sequenced = reader_result_mjs_1.ReaderResult.sequence(rrs);
|
|
529
|
-
promise = reader_result_mjs_1.ReaderResult.run(mockDeps)(sequenced);
|
|
530
|
-
// first operation takes 30ms
|
|
531
|
-
return [4 /*yield*/, vitest_1.vi.advanceTimersByTimeAsync(30)];
|
|
532
|
-
case 1:
|
|
533
|
-
// first operation takes 30ms
|
|
534
|
-
_a.sent();
|
|
535
|
-
(0, vitest_1.expect)(executionOrder).toEqual([1]); // only first should be done
|
|
536
|
-
// second operation takes 10ms
|
|
537
|
-
return [4 /*yield*/, vitest_1.vi.advanceTimersByTimeAsync(10)];
|
|
538
|
-
case 2:
|
|
539
|
-
// second operation takes 10ms
|
|
540
|
-
_a.sent();
|
|
541
|
-
(0, vitest_1.expect)(executionOrder).toEqual([1, 2]); // both should be done now
|
|
542
|
-
return [4 /*yield*/, promise];
|
|
543
|
-
case 3:
|
|
544
|
-
result = _a.sent();
|
|
545
|
-
(0, vitest_1.expect)(result.success).toBe(true);
|
|
546
|
-
return [2 /*return*/];
|
|
547
|
-
}
|
|
548
|
-
});
|
|
549
|
-
}); });
|
|
550
|
-
});
|
|
551
|
-
(0, vitest_1.describe)('Do notation', function () {
|
|
552
|
-
(0, vitest_1.it)('builds computations with Do notation', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
553
|
-
var computation, result;
|
|
554
|
-
return __generator(this, function (_a) {
|
|
555
|
-
switch (_a.label) {
|
|
556
|
-
case 0:
|
|
557
|
-
computation = reader_result_mjs_1.ReaderResult.map(function (_a) {
|
|
558
|
-
var x = _a.x, y = _a.y, sum = _a.sum;
|
|
559
|
-
return ({ x: x, y: y, sum: sum });
|
|
560
|
-
})(reader_result_mjs_1.ReaderResult.let('sum', function (_a) {
|
|
561
|
-
var x = _a.x, y = _a.y;
|
|
562
|
-
return x + y;
|
|
563
|
-
})(reader_result_mjs_1.ReaderResult.bind('y', function (_a) {
|
|
564
|
-
var x = _a.x;
|
|
565
|
-
return reader_result_mjs_1.ReaderResult.of(x * 2);
|
|
566
|
-
})(reader_result_mjs_1.ReaderResult.bind('x', function () { return reader_result_mjs_1.ReaderResult.of(5); })(reader_result_mjs_1.ReaderResult.Do()))));
|
|
567
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(computation)];
|
|
568
|
-
case 1:
|
|
569
|
-
result = _a.sent();
|
|
570
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: { x: 5, y: 10, sum: 15 } });
|
|
571
|
-
return [2 /*return*/];
|
|
572
|
-
}
|
|
573
|
-
});
|
|
574
|
-
}); });
|
|
575
|
-
(0, vitest_1.it)('short-circuits on error in Do notation', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
576
|
-
var computation, result;
|
|
577
|
-
return __generator(this, function (_a) {
|
|
578
|
-
switch (_a.label) {
|
|
579
|
-
case 0:
|
|
580
|
-
computation = reader_result_mjs_1.ReaderResult.bind('z', function (_a) {
|
|
581
|
-
var x = _a.x, y = _a.y;
|
|
582
|
-
return reader_result_mjs_1.ReaderResult.of(x + y);
|
|
583
|
-
})(reader_result_mjs_1.ReaderResult.bind('y', function () { return reader_result_mjs_1.ReaderResult.fail('error'); })(reader_result_mjs_1.ReaderResult.bind('x', function () { return reader_result_mjs_1.ReaderResult.of(5); })(reader_result_mjs_1.ReaderResult.Do())));
|
|
584
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(computation)];
|
|
585
|
-
case 1:
|
|
586
|
-
result = _a.sent();
|
|
587
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
588
|
-
return [2 /*return*/];
|
|
589
|
-
}
|
|
590
|
-
});
|
|
591
|
-
}); });
|
|
592
|
-
});
|
|
593
|
-
(0, vitest_1.describe)('orElse', function () {
|
|
594
|
-
(0, vitest_1.it)('returns original value when successful', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
595
|
-
var rr, result;
|
|
596
|
-
return __generator(this, function (_a) {
|
|
597
|
-
switch (_a.label) {
|
|
598
|
-
case 0:
|
|
599
|
-
rr = reader_result_mjs_1.ReaderResult.orElse(function () { return reader_result_mjs_1.ReaderResult.of(0); })(reader_result_mjs_1.ReaderResult.of(42));
|
|
600
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
601
|
-
case 1:
|
|
602
|
-
result = _a.sent();
|
|
603
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
604
|
-
return [2 /*return*/];
|
|
605
|
-
}
|
|
606
|
-
});
|
|
607
|
-
}); });
|
|
608
|
-
(0, vitest_1.it)('uses fallback when original fails', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
609
|
-
var rr, result;
|
|
610
|
-
return __generator(this, function (_a) {
|
|
611
|
-
switch (_a.label) {
|
|
612
|
-
case 0:
|
|
613
|
-
rr = reader_result_mjs_1.ReaderResult.orElse(function () { return reader_result_mjs_1.ReaderResult.of(99); })(reader_result_mjs_1.ReaderResult.fail('error'));
|
|
614
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
615
|
-
case 1:
|
|
616
|
-
result = _a.sent();
|
|
617
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 99 });
|
|
618
|
-
return [2 /*return*/];
|
|
619
|
-
}
|
|
620
|
-
});
|
|
621
|
-
}); });
|
|
622
|
-
(0, vitest_1.it)('can transform error type', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
623
|
-
var rr, result;
|
|
624
|
-
return __generator(this, function (_a) {
|
|
625
|
-
switch (_a.label) {
|
|
626
|
-
case 0:
|
|
627
|
-
rr = reader_result_mjs_1.ReaderResult.orElse(function (error) {
|
|
628
|
-
return reader_result_mjs_1.ReaderResult.fail(new Error(error));
|
|
629
|
-
})(reader_result_mjs_1.ReaderResult.fail('string error'));
|
|
630
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
631
|
-
case 1:
|
|
632
|
-
result = _a.sent();
|
|
633
|
-
(0, vitest_1.expect)(result.success).toBe(false);
|
|
634
|
-
if (!result.success) {
|
|
635
|
-
(0, vitest_1.expect)(result.error).toBeInstanceOf(Error);
|
|
636
|
-
(0, vitest_1.expect)(result.error.message).toBe('string error');
|
|
637
|
-
}
|
|
638
|
-
return [2 /*return*/];
|
|
639
|
-
}
|
|
640
|
-
});
|
|
641
|
-
}); });
|
|
642
|
-
(0, vitest_1.it)('fallback has access to dependencies', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
643
|
-
var rr, result;
|
|
644
|
-
return __generator(this, function (_a) {
|
|
645
|
-
switch (_a.label) {
|
|
646
|
-
case 0:
|
|
647
|
-
rr = reader_result_mjs_1.ReaderResult.orElse(function () {
|
|
648
|
-
return reader_result_mjs_1.ReaderResult.asks(function (deps) {
|
|
649
|
-
deps.logger.log('Using fallback');
|
|
650
|
-
return 42;
|
|
651
|
-
});
|
|
652
|
-
})(reader_result_mjs_1.ReaderResult.fail('error'));
|
|
653
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
654
|
-
case 1:
|
|
655
|
-
result = _a.sent();
|
|
656
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
657
|
-
(0, vitest_1.expect)(mockDeps.logger.log).toHaveBeenCalledWith('Using fallback');
|
|
658
|
-
return [2 /*return*/];
|
|
659
|
-
}
|
|
660
|
-
});
|
|
661
|
-
}); });
|
|
662
|
-
});
|
|
663
|
-
(0, vitest_1.describe)('timeout', function () {
|
|
664
|
-
(0, vitest_1.it)('returns result when computation completes in time', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
665
|
-
var base, rr, result;
|
|
666
|
-
return __generator(this, function (_a) {
|
|
667
|
-
switch (_a.label) {
|
|
668
|
-
case 0:
|
|
669
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
670
|
-
return __generator(this, function (_a) {
|
|
671
|
-
switch (_a.label) {
|
|
672
|
-
case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 10); })];
|
|
673
|
-
case 1:
|
|
674
|
-
_a.sent();
|
|
675
|
-
return [2 /*return*/, 42];
|
|
676
|
-
}
|
|
677
|
-
});
|
|
678
|
-
}); }, function () { return 'error'; });
|
|
679
|
-
rr = reader_result_mjs_1.ReaderResult.timeout(100, 'timeout')(base);
|
|
680
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
681
|
-
case 1:
|
|
682
|
-
result = _a.sent();
|
|
683
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
684
|
-
return [2 /*return*/];
|
|
685
|
-
}
|
|
686
|
-
});
|
|
687
|
-
}); });
|
|
688
|
-
(0, vitest_1.it)('returns timeout error when computation takes too long', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
689
|
-
var base, rr, result;
|
|
690
|
-
return __generator(this, function (_a) {
|
|
691
|
-
switch (_a.label) {
|
|
692
|
-
case 0:
|
|
693
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
694
|
-
return __generator(this, function (_a) {
|
|
695
|
-
switch (_a.label) {
|
|
696
|
-
case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 100); })];
|
|
697
|
-
case 1:
|
|
698
|
-
_a.sent();
|
|
699
|
-
return [2 /*return*/, 42];
|
|
700
|
-
}
|
|
701
|
-
});
|
|
702
|
-
}); }, function () { return 'error'; });
|
|
703
|
-
rr = reader_result_mjs_1.ReaderResult.timeout(50, 'timeout')(base);
|
|
704
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
705
|
-
case 1:
|
|
706
|
-
result = _a.sent();
|
|
707
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'timeout' });
|
|
708
|
-
return [2 /*return*/];
|
|
709
|
-
}
|
|
710
|
-
});
|
|
711
|
-
}); });
|
|
712
|
-
(0, vitest_1.it)('propagates immediate errors without timing out', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
713
|
-
var base, rr, result;
|
|
714
|
-
return __generator(this, function (_a) {
|
|
715
|
-
switch (_a.label) {
|
|
716
|
-
case 0:
|
|
717
|
-
base = reader_result_mjs_1.ReaderResult.fail('immediate error');
|
|
718
|
-
rr = reader_result_mjs_1.ReaderResult.timeout(100, 'timeout')(base);
|
|
719
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
720
|
-
case 1:
|
|
721
|
-
result = _a.sent();
|
|
722
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'immediate error' });
|
|
723
|
-
return [2 /*return*/];
|
|
724
|
-
}
|
|
725
|
-
});
|
|
726
|
-
}); });
|
|
727
|
-
});
|
|
728
|
-
(0, vitest_1.describe)('retry', function () {
|
|
729
|
-
(0, vitest_1.it)('returns successful result without retry', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
730
|
-
var attempts, base, rr, result;
|
|
731
|
-
return __generator(this, function (_a) {
|
|
732
|
-
switch (_a.label) {
|
|
733
|
-
case 0:
|
|
734
|
-
attempts = 0;
|
|
735
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.resolve().then(function () {
|
|
736
|
-
attempts++;
|
|
737
|
-
return 42;
|
|
738
|
-
}); }, function () { return 'error'; });
|
|
739
|
-
rr = reader_result_mjs_1.ReaderResult.retry(3)(base);
|
|
740
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
741
|
-
case 1:
|
|
742
|
-
result = _a.sent();
|
|
743
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
744
|
-
(0, vitest_1.expect)(attempts).toBe(1);
|
|
745
|
-
return [2 /*return*/];
|
|
746
|
-
}
|
|
747
|
-
});
|
|
748
|
-
}); });
|
|
749
|
-
(0, vitest_1.it)('retries on failure and eventually succeeds', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
750
|
-
var attempts, base, rr, result;
|
|
751
|
-
return __generator(this, function (_a) {
|
|
752
|
-
switch (_a.label) {
|
|
753
|
-
case 0:
|
|
754
|
-
attempts = 0;
|
|
755
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.resolve().then(function () {
|
|
756
|
-
attempts++;
|
|
757
|
-
if (attempts < 3)
|
|
758
|
-
throw new Error('fail');
|
|
759
|
-
return 42;
|
|
760
|
-
}); }, function () { return 'error'; });
|
|
761
|
-
rr = reader_result_mjs_1.ReaderResult.retry(3, 10)(base);
|
|
762
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
763
|
-
case 1:
|
|
764
|
-
result = _a.sent();
|
|
765
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 42 });
|
|
766
|
-
(0, vitest_1.expect)(attempts).toBe(3);
|
|
767
|
-
return [2 /*return*/];
|
|
768
|
-
}
|
|
769
|
-
});
|
|
770
|
-
}); });
|
|
771
|
-
(0, vitest_1.it)('fails after max attempts', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
772
|
-
var attempts, base, rr, result;
|
|
773
|
-
return __generator(this, function (_a) {
|
|
774
|
-
switch (_a.label) {
|
|
775
|
-
case 0:
|
|
776
|
-
attempts = 0;
|
|
777
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.resolve().then(function () {
|
|
778
|
-
attempts++;
|
|
779
|
-
throw new Error('fail');
|
|
780
|
-
}); }, function () { return 'error'; });
|
|
781
|
-
rr = reader_result_mjs_1.ReaderResult.retry(3, 10)(base);
|
|
782
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
783
|
-
case 1:
|
|
784
|
-
result = _a.sent();
|
|
785
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
786
|
-
(0, vitest_1.expect)(attempts).toBe(3);
|
|
787
|
-
return [2 /*return*/];
|
|
788
|
-
}
|
|
789
|
-
});
|
|
790
|
-
}); });
|
|
791
|
-
(0, vitest_1.it)('uses shouldRetry predicate to allow retries', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
792
|
-
var attempts, base, rr;
|
|
793
|
-
return __generator(this, function (_a) {
|
|
794
|
-
switch (_a.label) {
|
|
795
|
-
case 0:
|
|
796
|
-
attempts = 0;
|
|
797
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.resolve().then(function () {
|
|
798
|
-
attempts++;
|
|
799
|
-
throw new Error('retry-me');
|
|
800
|
-
}); }, function (e) { return e.message; });
|
|
801
|
-
rr = reader_result_mjs_1.ReaderResult.retry(3, 10, function (error) { return error === 'retry-me'; })(base);
|
|
802
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
803
|
-
case 1:
|
|
804
|
-
_a.sent();
|
|
805
|
-
(0, vitest_1.expect)(attempts).toBe(3);
|
|
806
|
-
return [2 /*return*/];
|
|
807
|
-
}
|
|
808
|
-
});
|
|
809
|
-
}); });
|
|
810
|
-
(0, vitest_1.it)('uses shouldRetry predicate to prevent retries', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
811
|
-
var attempts, base, rr;
|
|
812
|
-
return __generator(this, function (_a) {
|
|
813
|
-
switch (_a.label) {
|
|
814
|
-
case 0:
|
|
815
|
-
attempts = 0;
|
|
816
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.resolve().then(function () {
|
|
817
|
-
attempts++;
|
|
818
|
-
throw new Error('do-not-retry');
|
|
819
|
-
}); }, function (e) { return e.message; });
|
|
820
|
-
rr = reader_result_mjs_1.ReaderResult.retry(3, 10, function (error) { return error === 'retry-me'; })(base);
|
|
821
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
822
|
-
case 1:
|
|
823
|
-
_a.sent();
|
|
824
|
-
(0, vitest_1.expect)(attempts).toBe(1);
|
|
825
|
-
return [2 /*return*/];
|
|
826
|
-
}
|
|
827
|
-
});
|
|
828
|
-
}); });
|
|
829
|
-
(0, vitest_1.it)('uses exponential backoff', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
830
|
-
var attempts, base, rr, promise;
|
|
831
|
-
return __generator(this, function (_a) {
|
|
832
|
-
switch (_a.label) {
|
|
833
|
-
case 0:
|
|
834
|
-
vitest_1.vi.useFakeTimers();
|
|
835
|
-
attempts = 0;
|
|
836
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.resolve().then(function () {
|
|
837
|
-
attempts++;
|
|
838
|
-
throw new Error('fail');
|
|
839
|
-
}); }, function () { return 'error'; });
|
|
840
|
-
rr = reader_result_mjs_1.ReaderResult.retry(3, 10)(base);
|
|
841
|
-
promise = reader_result_mjs_1.ReaderResult.run(mockDeps)(rr);
|
|
842
|
-
// wait for first attempt to complete
|
|
843
|
-
return [4 /*yield*/, vitest_1.vi.waitFor(function () { return (0, vitest_1.expect)(attempts).toBe(1); })];
|
|
844
|
-
case 1:
|
|
845
|
-
// wait for first attempt to complete
|
|
846
|
-
_a.sent();
|
|
847
|
-
// advance by 10ms for first retry (10 * 2^0)
|
|
848
|
-
return [4 /*yield*/, vitest_1.vi.advanceTimersByTimeAsync(10)];
|
|
849
|
-
case 2:
|
|
850
|
-
// advance by 10ms for first retry (10 * 2^0)
|
|
851
|
-
_a.sent();
|
|
852
|
-
return [4 /*yield*/, vitest_1.vi.waitFor(function () { return (0, vitest_1.expect)(attempts).toBe(2); })];
|
|
853
|
-
case 3:
|
|
854
|
-
_a.sent();
|
|
855
|
-
// advance by 20ms for second retry (10 * 2^1)
|
|
856
|
-
return [4 /*yield*/, vitest_1.vi.advanceTimersByTimeAsync(20)];
|
|
857
|
-
case 4:
|
|
858
|
-
// advance by 20ms for second retry (10 * 2^1)
|
|
859
|
-
_a.sent();
|
|
860
|
-
return [4 /*yield*/, vitest_1.vi.waitFor(function () { return (0, vitest_1.expect)(attempts).toBe(3); })];
|
|
861
|
-
case 5:
|
|
862
|
-
_a.sent();
|
|
863
|
-
return [4 /*yield*/, promise];
|
|
864
|
-
case 6:
|
|
865
|
-
_a.sent();
|
|
866
|
-
vitest_1.vi.useRealTimers();
|
|
867
|
-
return [2 /*return*/];
|
|
868
|
-
}
|
|
869
|
-
});
|
|
870
|
-
}); });
|
|
871
|
-
(0, vitest_1.it)('fails after a single attempt if maxAttempts is 1', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
872
|
-
var attempts, base, rr, result;
|
|
873
|
-
return __generator(this, function (_a) {
|
|
874
|
-
switch (_a.label) {
|
|
875
|
-
case 0:
|
|
876
|
-
attempts = 0;
|
|
877
|
-
base = reader_result_mjs_1.ReaderResult.tryCatch(function () { return Promise.resolve().then(function () {
|
|
878
|
-
attempts++;
|
|
879
|
-
throw new Error('fail');
|
|
880
|
-
}); }, function () { return 'error'; });
|
|
881
|
-
rr = reader_result_mjs_1.ReaderResult.retry(1, 10)(base);
|
|
882
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
883
|
-
case 1:
|
|
884
|
-
result = _a.sent();
|
|
885
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
886
|
-
(0, vitest_1.expect)(attempts).toBe(1);
|
|
887
|
-
return [2 /*return*/];
|
|
888
|
-
}
|
|
889
|
-
});
|
|
890
|
-
}); });
|
|
891
|
-
});
|
|
892
|
-
(0, vitest_1.describe)('sequencePar', function () {
|
|
893
|
-
(0, vitest_1.beforeEach)(function () {
|
|
894
|
-
vitest_1.vi.useFakeTimers();
|
|
895
|
-
});
|
|
896
|
-
(0, vitest_1.afterEach)(function () {
|
|
897
|
-
vitest_1.vi.useRealTimers();
|
|
898
|
-
});
|
|
899
|
-
(0, vitest_1.it)('sequences all successful ReaderResults in parallel', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
900
|
-
var rrs, sequenced, promise, result;
|
|
901
|
-
return __generator(this, function (_a) {
|
|
902
|
-
switch (_a.label) {
|
|
903
|
-
case 0:
|
|
904
|
-
rrs = [
|
|
905
|
-
reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
906
|
-
return __generator(this, function (_a) {
|
|
907
|
-
switch (_a.label) {
|
|
908
|
-
case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 20); })];
|
|
909
|
-
case 1:
|
|
910
|
-
_a.sent();
|
|
911
|
-
return [2 /*return*/, 1];
|
|
912
|
-
}
|
|
913
|
-
});
|
|
914
|
-
}); }, function () { return 'error'; }),
|
|
915
|
-
reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
916
|
-
return __generator(this, function (_a) {
|
|
917
|
-
switch (_a.label) {
|
|
918
|
-
case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 20); })];
|
|
919
|
-
case 1:
|
|
920
|
-
_a.sent();
|
|
921
|
-
return [2 /*return*/, 2];
|
|
922
|
-
}
|
|
923
|
-
});
|
|
924
|
-
}); }, function () { return 'error'; }),
|
|
925
|
-
reader_result_mjs_1.ReaderResult.tryCatch(function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
926
|
-
return __generator(this, function (_a) {
|
|
927
|
-
switch (_a.label) {
|
|
928
|
-
case 0: return [4 /*yield*/, new Promise(function (resolve) { return setTimeout(resolve, 20); })];
|
|
929
|
-
case 1:
|
|
930
|
-
_a.sent();
|
|
931
|
-
return [2 /*return*/, 3];
|
|
932
|
-
}
|
|
933
|
-
});
|
|
934
|
-
}); }, function () { return 'error'; }),
|
|
935
|
-
];
|
|
936
|
-
sequenced = reader_result_mjs_1.ReaderResult.sequencePar(rrs);
|
|
937
|
-
promise = reader_result_mjs_1.ReaderResult.run(mockDeps)(sequenced);
|
|
938
|
-
// all three operations run in parallel - advance time once by 20ms
|
|
939
|
-
return [4 /*yield*/, vitest_1.vi.advanceTimersByTimeAsync(20)];
|
|
940
|
-
case 1:
|
|
941
|
-
// all three operations run in parallel - advance time once by 20ms
|
|
942
|
-
_a.sent();
|
|
943
|
-
return [4 /*yield*/, promise];
|
|
944
|
-
case 2:
|
|
945
|
-
result = _a.sent();
|
|
946
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: [1, 2, 3] });
|
|
947
|
-
return [2 /*return*/];
|
|
948
|
-
}
|
|
949
|
-
});
|
|
950
|
-
}); });
|
|
951
|
-
(0, vitest_1.it)('returns first error on failure', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
952
|
-
var rrs, sequenced, result;
|
|
953
|
-
return __generator(this, function (_a) {
|
|
954
|
-
switch (_a.label) {
|
|
955
|
-
case 0:
|
|
956
|
-
rrs = [
|
|
957
|
-
reader_result_mjs_1.ReaderResult.of(1),
|
|
958
|
-
reader_result_mjs_1.ReaderResult.fail('error'),
|
|
959
|
-
reader_result_mjs_1.ReaderResult.of(3),
|
|
960
|
-
];
|
|
961
|
-
sequenced = reader_result_mjs_1.ReaderResult.sequencePar(rrs);
|
|
962
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(sequenced)];
|
|
963
|
-
case 1:
|
|
964
|
-
result = _a.sent();
|
|
965
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
966
|
-
return [2 /*return*/];
|
|
967
|
-
}
|
|
968
|
-
});
|
|
969
|
-
}); });
|
|
970
|
-
(0, vitest_1.it)('works with an empty array', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
971
|
-
var rrs, sequenced, result;
|
|
972
|
-
return __generator(this, function (_a) {
|
|
973
|
-
switch (_a.label) {
|
|
974
|
-
case 0:
|
|
975
|
-
rrs = [];
|
|
976
|
-
sequenced = reader_result_mjs_1.ReaderResult.sequencePar(rrs);
|
|
977
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(sequenced)];
|
|
978
|
-
case 1:
|
|
979
|
-
result = _a.sent();
|
|
980
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: [] });
|
|
981
|
-
return [2 /*return*/];
|
|
982
|
-
}
|
|
983
|
-
});
|
|
984
|
-
}); });
|
|
985
|
-
});
|
|
986
|
-
(0, vitest_1.describe)('zipAll', function () {
|
|
987
|
-
(0, vitest_1.it)('combines multiple successful ReaderResults', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
988
|
-
var rr1, rr2, rr3, zipped, result;
|
|
989
|
-
return __generator(this, function (_a) {
|
|
990
|
-
switch (_a.label) {
|
|
991
|
-
case 0:
|
|
992
|
-
rr1 = reader_result_mjs_1.ReaderResult.of(1);
|
|
993
|
-
rr2 = reader_result_mjs_1.ReaderResult.of('hello');
|
|
994
|
-
rr3 = reader_result_mjs_1.ReaderResult.of(true);
|
|
995
|
-
zipped = reader_result_mjs_1.ReaderResult.zipAll(rr1, rr2, rr3);
|
|
996
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(zipped)];
|
|
997
|
-
case 1:
|
|
998
|
-
result = _a.sent();
|
|
999
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: [1, 'hello', true] });
|
|
1000
|
-
return [2 /*return*/];
|
|
1001
|
-
}
|
|
1002
|
-
});
|
|
1003
|
-
}); });
|
|
1004
|
-
(0, vitest_1.it)('returns first error when any fails', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1005
|
-
var rr1, rr2, rr3, zipped, result;
|
|
1006
|
-
return __generator(this, function (_a) {
|
|
1007
|
-
switch (_a.label) {
|
|
1008
|
-
case 0:
|
|
1009
|
-
rr1 = reader_result_mjs_1.ReaderResult.of(1);
|
|
1010
|
-
rr2 = reader_result_mjs_1.ReaderResult.fail('error');
|
|
1011
|
-
rr3 = reader_result_mjs_1.ReaderResult.of(true);
|
|
1012
|
-
zipped = reader_result_mjs_1.ReaderResult.zipAll(rr1, rr2, rr3);
|
|
1013
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(zipped)];
|
|
1014
|
-
case 1:
|
|
1015
|
-
result = _a.sent();
|
|
1016
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'error' });
|
|
1017
|
-
return [2 /*return*/];
|
|
1018
|
-
}
|
|
1019
|
-
});
|
|
1020
|
-
}); });
|
|
1021
|
-
});
|
|
1022
|
-
(0, vitest_1.describe)('parallel', function () {
|
|
1023
|
-
(0, vitest_1.it)('runs multiple ReaderResults in parallel and collects all results', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1024
|
-
var rrs, parallel, result;
|
|
1025
|
-
return __generator(this, function (_a) {
|
|
1026
|
-
switch (_a.label) {
|
|
1027
|
-
case 0:
|
|
1028
|
-
rrs = {
|
|
1029
|
-
x: reader_result_mjs_1.ReaderResult.of(5),
|
|
1030
|
-
y: reader_result_mjs_1.ReaderResult.of('hello'),
|
|
1031
|
-
z: reader_result_mjs_1.ReaderResult.of(true),
|
|
1032
|
-
};
|
|
1033
|
-
parallel = reader_result_mjs_1.ReaderResult.parallel(rrs);
|
|
1034
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(parallel)];
|
|
1035
|
-
case 1:
|
|
1036
|
-
result = _a.sent();
|
|
1037
|
-
(0, vitest_1.expect)(result).toEqual({
|
|
1038
|
-
success: true,
|
|
1039
|
-
data: { x: 5, y: 'hello', z: true }
|
|
1040
|
-
});
|
|
1041
|
-
return [2 /*return*/];
|
|
1042
|
-
}
|
|
1043
|
-
});
|
|
1044
|
-
}); });
|
|
1045
|
-
(0, vitest_1.it)('collects all errors instead of short-circuiting', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1046
|
-
var rrs, parallel, result;
|
|
1047
|
-
return __generator(this, function (_a) {
|
|
1048
|
-
switch (_a.label) {
|
|
1049
|
-
case 0:
|
|
1050
|
-
rrs = {
|
|
1051
|
-
x: reader_result_mjs_1.ReaderResult.of(5),
|
|
1052
|
-
y: reader_result_mjs_1.ReaderResult.fail('error1'),
|
|
1053
|
-
z: reader_result_mjs_1.ReaderResult.fail('error2'),
|
|
1054
|
-
};
|
|
1055
|
-
parallel = reader_result_mjs_1.ReaderResult.parallel(rrs);
|
|
1056
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(parallel)];
|
|
1057
|
-
case 1:
|
|
1058
|
-
result = _a.sent();
|
|
1059
|
-
(0, vitest_1.expect)(result).toEqual({
|
|
1060
|
-
success: false,
|
|
1061
|
-
error: [
|
|
1062
|
-
{ key: 'y', error: 'error1' },
|
|
1063
|
-
{ key: 'z', error: 'error2' }
|
|
1064
|
-
]
|
|
1065
|
-
});
|
|
1066
|
-
return [2 /*return*/];
|
|
1067
|
-
}
|
|
1068
|
-
});
|
|
1069
|
-
}); });
|
|
1070
|
-
(0, vitest_1.it)('returns empty object for empty input', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1071
|
-
var rrs, parallel, result;
|
|
1072
|
-
return __generator(this, function (_a) {
|
|
1073
|
-
switch (_a.label) {
|
|
1074
|
-
case 0:
|
|
1075
|
-
rrs = {};
|
|
1076
|
-
parallel = reader_result_mjs_1.ReaderResult.parallel(rrs);
|
|
1077
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(parallel)];
|
|
1078
|
-
case 1:
|
|
1079
|
-
result = _a.sent();
|
|
1080
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: {} });
|
|
1081
|
-
return [2 /*return*/];
|
|
1082
|
-
}
|
|
1083
|
-
});
|
|
1084
|
-
}); });
|
|
1085
|
-
});
|
|
1086
|
-
(0, vitest_1.describe)('liftDomain', function () {
|
|
1087
|
-
(0, vitest_1.it)('lifts a domain function returning Result', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1088
|
-
var domainFn, lifted, rr1, result1, rr2, result2;
|
|
1089
|
-
return __generator(this, function (_a) {
|
|
1090
|
-
switch (_a.label) {
|
|
1091
|
-
case 0:
|
|
1092
|
-
domainFn = function (x) {
|
|
1093
|
-
return x > 0 ? result_mjs_1.Result.ok(x * 2) : result_mjs_1.Result.err('negative');
|
|
1094
|
-
};
|
|
1095
|
-
lifted = (0, reader_result_mjs_1.liftDomain)(domainFn);
|
|
1096
|
-
rr1 = lifted(5);
|
|
1097
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr1)];
|
|
1098
|
-
case 1:
|
|
1099
|
-
result1 = _a.sent();
|
|
1100
|
-
(0, vitest_1.expect)(result1).toEqual({ success: true, data: 10 });
|
|
1101
|
-
rr2 = lifted(-5);
|
|
1102
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr2)];
|
|
1103
|
-
case 2:
|
|
1104
|
-
result2 = _a.sent();
|
|
1105
|
-
(0, vitest_1.expect)(result2).toEqual({ success: false, error: 'negative' });
|
|
1106
|
-
return [2 /*return*/];
|
|
1107
|
-
}
|
|
1108
|
-
});
|
|
1109
|
-
}); });
|
|
1110
|
-
});
|
|
1111
|
-
(0, vitest_1.describe)('liftAsync', function () {
|
|
1112
|
-
(0, vitest_1.it)('lifts an async function that uses dependencies', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1113
|
-
var findUserName, rr, result;
|
|
1114
|
-
return __generator(this, function (_a) {
|
|
1115
|
-
switch (_a.label) {
|
|
1116
|
-
case 0:
|
|
1117
|
-
vitest_1.vi.mocked(mockDeps.db.findUser).mockResolvedValue({ id: '1', name: 'John' });
|
|
1118
|
-
findUserName = (0, reader_result_mjs_1.liftAsync)(function (deps, userId) { return __awaiter(void 0, void 0, void 0, function () {
|
|
1119
|
-
var user;
|
|
1120
|
-
return __generator(this, function (_a) {
|
|
1121
|
-
switch (_a.label) {
|
|
1122
|
-
case 0: return [4 /*yield*/, deps.db.findUser(userId)];
|
|
1123
|
-
case 1:
|
|
1124
|
-
user = _a.sent();
|
|
1125
|
-
if (!user)
|
|
1126
|
-
throw new Error('User not found');
|
|
1127
|
-
return [2 /*return*/, user.name];
|
|
1128
|
-
}
|
|
1129
|
-
});
|
|
1130
|
-
}); }, function (error) { return error instanceof Error ? error.message : 'unknown'; });
|
|
1131
|
-
rr = findUserName('1');
|
|
1132
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
1133
|
-
case 1:
|
|
1134
|
-
result = _a.sent();
|
|
1135
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: 'John' });
|
|
1136
|
-
(0, vitest_1.expect)(mockDeps.db.findUser).toHaveBeenCalledWith('1');
|
|
1137
|
-
return [2 /*return*/];
|
|
1138
|
-
}
|
|
1139
|
-
});
|
|
1140
|
-
}); });
|
|
1141
|
-
(0, vitest_1.it)('handles errors from async function', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1142
|
-
var findUserName, rr, result;
|
|
1143
|
-
return __generator(this, function (_a) {
|
|
1144
|
-
switch (_a.label) {
|
|
1145
|
-
case 0:
|
|
1146
|
-
vitest_1.vi.mocked(mockDeps.db.findUser).mockResolvedValue(null);
|
|
1147
|
-
findUserName = (0, reader_result_mjs_1.liftAsync)(function (deps, userId) { return __awaiter(void 0, void 0, void 0, function () {
|
|
1148
|
-
var user;
|
|
1149
|
-
return __generator(this, function (_a) {
|
|
1150
|
-
switch (_a.label) {
|
|
1151
|
-
case 0: return [4 /*yield*/, deps.db.findUser(userId)];
|
|
1152
|
-
case 1:
|
|
1153
|
-
user = _a.sent();
|
|
1154
|
-
if (!user)
|
|
1155
|
-
throw new Error('User not found');
|
|
1156
|
-
return [2 /*return*/, user.name];
|
|
1157
|
-
}
|
|
1158
|
-
});
|
|
1159
|
-
}); }, function (error) { return error instanceof Error ? error.message : 'unknown'; });
|
|
1160
|
-
rr = findUserName('1');
|
|
1161
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(rr)];
|
|
1162
|
-
case 1:
|
|
1163
|
-
result = _a.sent();
|
|
1164
|
-
(0, vitest_1.expect)(result).toEqual({ success: false, error: 'User not found' });
|
|
1165
|
-
return [2 /*return*/];
|
|
1166
|
-
}
|
|
1167
|
-
});
|
|
1168
|
-
}); });
|
|
1169
|
-
});
|
|
1170
|
-
(0, vitest_1.describe)('Integration examples', function () {
|
|
1171
|
-
(0, vitest_1.it)('composes multiple operations with proper error handling', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1172
|
-
var updateUserName, result;
|
|
1173
|
-
return __generator(this, function (_a) {
|
|
1174
|
-
switch (_a.label) {
|
|
1175
|
-
case 0:
|
|
1176
|
-
vitest_1.vi.mocked(mockDeps.db.findUser).mockResolvedValue({ id: '1', name: 'John' });
|
|
1177
|
-
vitest_1.vi.mocked(mockDeps.db.saveUser).mockResolvedValue(undefined);
|
|
1178
|
-
updateUserName = function (userId, newName) {
|
|
1179
|
-
var findUser = reader_result_mjs_1.ReaderResult.tryCatch(function (deps) { return __awaiter(void 0, void 0, void 0, function () {
|
|
1180
|
-
var user;
|
|
1181
|
-
return __generator(this, function (_a) {
|
|
1182
|
-
switch (_a.label) {
|
|
1183
|
-
case 0: return [4 /*yield*/, deps.db.findUser(userId)];
|
|
1184
|
-
case 1:
|
|
1185
|
-
user = _a.sent();
|
|
1186
|
-
if (!user)
|
|
1187
|
-
throw new Error('User not found');
|
|
1188
|
-
return [2 /*return*/, user];
|
|
1189
|
-
}
|
|
1190
|
-
});
|
|
1191
|
-
}); }, function (error) { return error instanceof Error ? error.message : 'unknown'; });
|
|
1192
|
-
return reader_result_mjs_1.ReaderResult.chain(function (user) {
|
|
1193
|
-
var saveOp = reader_result_mjs_1.ReaderResult.tryCatch(function (deps) { return __awaiter(void 0, void 0, void 0, function () {
|
|
1194
|
-
return __generator(this, function (_a) {
|
|
1195
|
-
switch (_a.label) {
|
|
1196
|
-
case 0:
|
|
1197
|
-
deps.logger.log("Updating user ".concat(user.id));
|
|
1198
|
-
return [4 /*yield*/, deps.db.saveUser(__assign(__assign({}, user), { name: newName }))];
|
|
1199
|
-
case 1:
|
|
1200
|
-
_a.sent();
|
|
1201
|
-
return [2 /*return*/];
|
|
1202
|
-
}
|
|
1203
|
-
});
|
|
1204
|
-
}); }, function (error) { return error instanceof Error ? error.message : 'unknown'; });
|
|
1205
|
-
return reader_result_mjs_1.ReaderResult.map(function () { return (__assign(__assign({}, user), { name: newName })); })(saveOp);
|
|
1206
|
-
})(findUser);
|
|
1207
|
-
};
|
|
1208
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(updateUserName('1', 'Jane'))];
|
|
1209
|
-
case 1:
|
|
1210
|
-
result = _a.sent();
|
|
1211
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: { id: '1', name: 'Jane' } });
|
|
1212
|
-
(0, vitest_1.expect)(mockDeps.logger.log).toHaveBeenCalledWith('Updating user 1');
|
|
1213
|
-
(0, vitest_1.expect)(mockDeps.db.saveUser).toHaveBeenCalledWith({ id: '1', name: 'Jane' });
|
|
1214
|
-
return [2 /*return*/];
|
|
1215
|
-
}
|
|
1216
|
-
});
|
|
1217
|
-
}); });
|
|
1218
|
-
(0, vitest_1.it)('handles complex workflows with retry and timeout', function () { return __awaiter(void 0, void 0, void 0, function () {
|
|
1219
|
-
var attempts, findUserWithRetry, result;
|
|
1220
|
-
return __generator(this, function (_a) {
|
|
1221
|
-
switch (_a.label) {
|
|
1222
|
-
case 0:
|
|
1223
|
-
attempts = 0;
|
|
1224
|
-
vitest_1.vi.mocked(mockDeps.db.findUser).mockImplementation(function () { return Promise.resolve().then(function () {
|
|
1225
|
-
attempts++;
|
|
1226
|
-
if (attempts < 2)
|
|
1227
|
-
throw new Error('Connection error');
|
|
1228
|
-
return { id: '1', name: 'John' };
|
|
1229
|
-
}); });
|
|
1230
|
-
findUserWithRetry = function (userId) {
|
|
1231
|
-
var base = reader_result_mjs_1.ReaderResult.tryCatch(function (deps) { return __awaiter(void 0, void 0, void 0, function () {
|
|
1232
|
-
var user;
|
|
1233
|
-
return __generator(this, function (_a) {
|
|
1234
|
-
switch (_a.label) {
|
|
1235
|
-
case 0: return [4 /*yield*/, deps.db.findUser(userId)];
|
|
1236
|
-
case 1:
|
|
1237
|
-
user = _a.sent();
|
|
1238
|
-
if (!user)
|
|
1239
|
-
throw new Error('User not found');
|
|
1240
|
-
return [2 /*return*/, user];
|
|
1241
|
-
}
|
|
1242
|
-
});
|
|
1243
|
-
}); }, function (error) { return error instanceof Error ? error.message : 'unknown'; });
|
|
1244
|
-
var withRetry = reader_result_mjs_1.ReaderResult.retry(3, 10)(base);
|
|
1245
|
-
var withTimeout = reader_result_mjs_1.ReaderResult.timeout(1000, 'Operation timed out')(withRetry);
|
|
1246
|
-
return withTimeout;
|
|
1247
|
-
};
|
|
1248
|
-
return [4 /*yield*/, reader_result_mjs_1.ReaderResult.run(mockDeps)(findUserWithRetry('1'))];
|
|
1249
|
-
case 1:
|
|
1250
|
-
result = _a.sent();
|
|
1251
|
-
(0, vitest_1.expect)(result).toEqual({ success: true, data: { id: '1', name: 'John' } });
|
|
1252
|
-
(0, vitest_1.expect)(attempts).toBe(2);
|
|
1253
|
-
return [2 /*return*/];
|
|
1254
|
-
}
|
|
1255
|
-
});
|
|
1256
|
-
}); });
|
|
1257
|
-
});
|
|
1258
|
-
});
|
|
1259
|
-
//# sourceMappingURL=reader-result.test.js.map
|