@pvorona/failable 0.4.0 → 0.6.0
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 +330 -267
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +139 -117
- package/dist/lib/failable.d.ts +62 -40
- package/dist/lib/failable.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export
|
|
1
|
+
export { FailableStatus, NormalizedErrors, failable, failure, isFailable, isFailableLike, isFailure, isSuccess, run, success, throwIfError, toFailableLike, } from './lib/failable.js';
|
|
2
|
+
export type { FailableNormalizeErrorOptions, Failable, FailableLike, FailableLikeFailure, FailableLikeSuccess, Failure, Success, } from './lib/failable.js';
|
|
2
3
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,gBAAgB,EAChB,QAAQ,EACR,OAAO,EACP,UAAU,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,GAAG,EACH,OAAO,EACP,YAAY,EACZ,cAAc,GACf,MAAM,mBAAmB,CAAC;AAE3B,YAAY,EACV,6BAA6B,EAC7B,QAAQ,EACR,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EACnB,OAAO,EACP,OAAO,GACR,MAAM,mBAAmB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
import { isFunction as
|
|
2
|
-
import { notImplemented as
|
|
3
|
-
const
|
|
1
|
+
import { isFunction as E, isObject as c, hasOwnPropertyValue as S, hasOwnKey as y } from "@pvorona/assert";
|
|
2
|
+
import { notImplemented as a } from "@pvorona/not-implemented";
|
|
3
|
+
const F = /* @__PURE__ */ Symbol("Failable"), A = /* @__PURE__ */ Symbol("Success"), O = /* @__PURE__ */ Symbol("Failure"), u = Object.freeze({
|
|
4
4
|
Success: "success",
|
|
5
5
|
Failure: "failure"
|
|
6
6
|
}), k = Object.freeze({
|
|
7
7
|
mode: "normalized-errors"
|
|
8
8
|
});
|
|
9
|
-
function P(r) {
|
|
10
|
-
return l(r) && Object.keys(r).length === 2 && b(r, "status", u.Success) && F(r, "data");
|
|
11
|
-
}
|
|
12
9
|
function G(r) {
|
|
13
|
-
return
|
|
10
|
+
return c(r) && Object.keys(r).length === 2 && S(r, "status", u.Success) && y(r, "data");
|
|
11
|
+
}
|
|
12
|
+
function T(r) {
|
|
13
|
+
return c(r) && Object.keys(r).length === 2 && S(r, "status", u.Failure) && y(r, "error");
|
|
14
14
|
}
|
|
15
15
|
function w(r) {
|
|
16
|
-
return
|
|
16
|
+
return T(r) || G(r);
|
|
17
17
|
}
|
|
18
18
|
const m = {
|
|
19
|
-
[
|
|
19
|
+
[F]: !0,
|
|
20
20
|
isSuccess: !1,
|
|
21
|
-
|
|
21
|
+
isFailure: !1,
|
|
22
22
|
data: null,
|
|
23
23
|
error: null,
|
|
24
|
-
or:
|
|
25
|
-
orElse:
|
|
26
|
-
getOr:
|
|
27
|
-
getOrElse:
|
|
28
|
-
getOrThrow:
|
|
29
|
-
match:
|
|
30
|
-
},
|
|
24
|
+
or: a,
|
|
25
|
+
orElse: a,
|
|
26
|
+
getOr: a,
|
|
27
|
+
getOrElse: a,
|
|
28
|
+
getOrThrow: a,
|
|
29
|
+
match: a
|
|
30
|
+
}, p = (() => {
|
|
31
31
|
const r = Object.create(m);
|
|
32
32
|
return r[A] = !0, r.status = u.Success, r.isSuccess = !0, r.or = function() {
|
|
33
33
|
return this;
|
|
@@ -42,12 +42,12 @@ const m = {
|
|
|
42
42
|
}, r.match = function(t) {
|
|
43
43
|
return t(this.data);
|
|
44
44
|
}, Object.freeze(r);
|
|
45
|
-
})(),
|
|
45
|
+
})(), N = (() => {
|
|
46
46
|
const r = Object.create(m);
|
|
47
|
-
return r[
|
|
48
|
-
return
|
|
47
|
+
return r[O] = !0, r.status = u.Failure, r.isFailure = !0, r.or = function(t) {
|
|
48
|
+
return f(t);
|
|
49
49
|
}, r.orElse = function(t) {
|
|
50
|
-
return
|
|
50
|
+
return f(t());
|
|
51
51
|
}, r.getOr = function(t) {
|
|
52
52
|
return t;
|
|
53
53
|
}, r.getOrElse = function(t) {
|
|
@@ -58,37 +58,35 @@ const m = {
|
|
|
58
58
|
return n(this.error);
|
|
59
59
|
}, Object.freeze(r);
|
|
60
60
|
})();
|
|
61
|
-
function
|
|
62
|
-
return
|
|
61
|
+
function b(r, e) {
|
|
62
|
+
return c(r) ? r[e] === !0 : !1;
|
|
63
63
|
}
|
|
64
|
-
function
|
|
65
|
-
return
|
|
64
|
+
function i(r) {
|
|
65
|
+
return b(r, F);
|
|
66
66
|
}
|
|
67
|
-
function
|
|
68
|
-
return
|
|
67
|
+
function ir(r) {
|
|
68
|
+
return b(r, A);
|
|
69
69
|
}
|
|
70
|
-
function
|
|
71
|
-
return
|
|
70
|
+
function sr(r) {
|
|
71
|
+
return b(r, O);
|
|
72
72
|
}
|
|
73
|
-
function
|
|
74
|
-
const e = Object.create(
|
|
73
|
+
function f(r) {
|
|
74
|
+
const e = Object.create(p);
|
|
75
75
|
return e.data = r, Object.freeze(e);
|
|
76
76
|
}
|
|
77
|
-
function
|
|
78
|
-
const e = Object.create(
|
|
77
|
+
function d(r) {
|
|
78
|
+
const e = Object.create(N);
|
|
79
79
|
return e.error = r, Object.freeze(e);
|
|
80
80
|
}
|
|
81
|
-
function
|
|
81
|
+
function ar(r) {
|
|
82
82
|
if (r.status === u.Failure) throw r.error;
|
|
83
83
|
}
|
|
84
|
-
function
|
|
84
|
+
function fr(r) {
|
|
85
85
|
return r.status === u.Failure ? { status: u.Failure, error: r.error } : { status: u.Success, data: r.data };
|
|
86
86
|
}
|
|
87
|
-
const U = "`
|
|
88
|
-
"CreateFailablePromiseCallbackGuard"
|
|
89
|
-
), N = /* @__PURE__ */ Symbol("RunGet");
|
|
87
|
+
const U = "`failable(() => ...)` only accepts synchronous callbacks. This callback returned a Promise. Pass the promise directly instead: `await failable(promise)`.", j = /* @__PURE__ */ Symbol("FailablePromiseCallbackGuard"), C = /* @__PURE__ */ Symbol("RunGet");
|
|
90
88
|
class s {
|
|
91
|
-
[
|
|
89
|
+
[C] = !0;
|
|
92
90
|
source;
|
|
93
91
|
constructor(e) {
|
|
94
92
|
this.source = e;
|
|
@@ -97,52 +95,52 @@ class s {
|
|
|
97
95
|
return new s(e);
|
|
98
96
|
}
|
|
99
97
|
}
|
|
100
|
-
const
|
|
101
|
-
function*
|
|
98
|
+
const l = "`run()` generators must yield only values produced by `get(...)`. Use `yield* get(...)` in normal code.", M = "`run()` generators must return a `Failable` or finish without returning a value.";
|
|
99
|
+
function* z(r) {
|
|
102
100
|
return yield s.create(r);
|
|
103
101
|
}
|
|
104
|
-
async function*
|
|
102
|
+
async function* B(r) {
|
|
105
103
|
return yield s.create(r);
|
|
106
104
|
}
|
|
107
|
-
function
|
|
108
|
-
return !
|
|
105
|
+
function R(r) {
|
|
106
|
+
return !c(r) && !E(r) ? !1 : E(r.then);
|
|
109
107
|
}
|
|
110
|
-
function
|
|
111
|
-
return
|
|
108
|
+
function x(r) {
|
|
109
|
+
return R(r) ? B(r) : z(r);
|
|
112
110
|
}
|
|
113
|
-
const
|
|
114
|
-
get:
|
|
111
|
+
const D = Object.freeze({
|
|
112
|
+
get: x
|
|
115
113
|
});
|
|
116
114
|
function I(r) {
|
|
117
115
|
if (!(r instanceof s))
|
|
118
|
-
throw new Error(
|
|
116
|
+
throw new Error(l);
|
|
119
117
|
const e = r.source;
|
|
120
|
-
if (!
|
|
121
|
-
throw new Error(
|
|
118
|
+
if (!i(e))
|
|
119
|
+
throw new Error(l);
|
|
122
120
|
return e;
|
|
123
121
|
}
|
|
124
|
-
async function
|
|
122
|
+
async function V(r) {
|
|
125
123
|
if (!(r instanceof s))
|
|
126
|
-
throw new Error(
|
|
124
|
+
throw new Error(l);
|
|
127
125
|
const e = await r.source;
|
|
128
|
-
if (!
|
|
129
|
-
throw new Error(
|
|
126
|
+
if (!i(e))
|
|
127
|
+
throw new Error(l);
|
|
130
128
|
return e;
|
|
131
129
|
}
|
|
132
|
-
async function
|
|
130
|
+
async function L(r) {
|
|
133
131
|
if (!(r instanceof s))
|
|
134
|
-
throw new Error(
|
|
132
|
+
throw new Error(l);
|
|
135
133
|
let e;
|
|
136
134
|
try {
|
|
137
135
|
e = await r.source;
|
|
138
136
|
} catch (t) {
|
|
139
137
|
return { kind: "rejection", rejection: t };
|
|
140
138
|
}
|
|
141
|
-
if (!
|
|
142
|
-
throw new Error(
|
|
139
|
+
if (!i(e))
|
|
140
|
+
throw new Error(l);
|
|
143
141
|
return { kind: "source", source: e };
|
|
144
142
|
}
|
|
145
|
-
function
|
|
143
|
+
function K(r, e) {
|
|
146
144
|
let t = r.return(e);
|
|
147
145
|
for (; !t.done; ) {
|
|
148
146
|
const n = I(t.value);
|
|
@@ -153,10 +151,10 @@ function v(r, e) {
|
|
|
153
151
|
t = r.next(n.data);
|
|
154
152
|
}
|
|
155
153
|
}
|
|
156
|
-
async function
|
|
154
|
+
async function H(r, e) {
|
|
157
155
|
let t = await r.return(e);
|
|
158
156
|
for (; !t.done; ) {
|
|
159
|
-
const n = await
|
|
157
|
+
const n = await V(t.value);
|
|
160
158
|
if (n.status === u.Failure) {
|
|
161
159
|
t = await r.return(e);
|
|
162
160
|
continue;
|
|
@@ -164,10 +162,10 @@ async function K(r, e) {
|
|
|
164
162
|
t = await r.next(n.data);
|
|
165
163
|
}
|
|
166
164
|
}
|
|
167
|
-
async function
|
|
165
|
+
async function J(r) {
|
|
168
166
|
let e = await r.return(void 0);
|
|
169
167
|
for (; !e.done; ) {
|
|
170
|
-
const t = await
|
|
168
|
+
const t = await L(e.value);
|
|
171
169
|
if (t.kind === "rejection") {
|
|
172
170
|
e = await r.return(void 0);
|
|
173
171
|
continue;
|
|
@@ -180,115 +178,139 @@ async function V(r) {
|
|
|
180
178
|
e = await r.next(n.data);
|
|
181
179
|
}
|
|
182
180
|
}
|
|
183
|
-
function
|
|
184
|
-
if (
|
|
181
|
+
function P(r) {
|
|
182
|
+
if (i(r))
|
|
185
183
|
return r;
|
|
186
184
|
if (r === void 0)
|
|
187
|
-
return
|
|
188
|
-
throw new Error(
|
|
185
|
+
return f(void 0);
|
|
186
|
+
throw new Error(M);
|
|
189
187
|
}
|
|
190
|
-
function
|
|
188
|
+
function W(r) {
|
|
191
189
|
return Symbol.asyncIterator in r;
|
|
192
190
|
}
|
|
193
|
-
function
|
|
191
|
+
function Y(r) {
|
|
194
192
|
let e = r.next();
|
|
195
193
|
for (; !e.done; ) {
|
|
196
194
|
const t = I(e.value);
|
|
197
195
|
if (t.status === u.Failure)
|
|
198
|
-
return
|
|
196
|
+
return K(r, t), t;
|
|
199
197
|
e = r.next(t.data);
|
|
200
198
|
}
|
|
201
|
-
return
|
|
199
|
+
return P(e.value);
|
|
202
200
|
}
|
|
203
|
-
async function
|
|
201
|
+
async function q(r) {
|
|
204
202
|
let e = await r.next();
|
|
205
203
|
for (; !e.done; ) {
|
|
206
|
-
const t = await
|
|
204
|
+
const t = await L(e.value);
|
|
207
205
|
if (t.kind === "rejection")
|
|
208
|
-
throw await
|
|
206
|
+
throw await J(r), t.rejection;
|
|
209
207
|
const n = t.source;
|
|
210
208
|
if (n.status === u.Failure)
|
|
211
|
-
return await
|
|
209
|
+
return await H(r, n), n;
|
|
212
210
|
e = await r.next(n.data);
|
|
213
211
|
}
|
|
214
|
-
return
|
|
212
|
+
return P(e.value);
|
|
215
213
|
}
|
|
216
|
-
function
|
|
217
|
-
const e = r(
|
|
218
|
-
return
|
|
214
|
+
function lr(r) {
|
|
215
|
+
const e = r(D);
|
|
216
|
+
return W(e) ? q(e) : Y(e);
|
|
219
217
|
}
|
|
220
|
-
function
|
|
221
|
-
return
|
|
218
|
+
function dr(r, e) {
|
|
219
|
+
return i(r) ? o(r, e) : w(r) ? o(g(r), e) : E(r) ? $(r, e) : v(r, e);
|
|
222
220
|
}
|
|
223
|
-
function
|
|
224
|
-
return r.status === u.Success ?
|
|
221
|
+
function g(r) {
|
|
222
|
+
return r.status === u.Success ? f(r.data) : d(r.error);
|
|
225
223
|
}
|
|
226
|
-
function
|
|
224
|
+
function Q() {
|
|
227
225
|
const r = new Error(
|
|
228
226
|
U
|
|
229
227
|
);
|
|
230
|
-
return Object.defineProperty(r,
|
|
228
|
+
return Object.defineProperty(r, j, {
|
|
231
229
|
value: !0,
|
|
232
230
|
enumerable: !1,
|
|
233
231
|
configurable: !1,
|
|
234
232
|
writable: !1
|
|
235
233
|
}), r;
|
|
236
234
|
}
|
|
237
|
-
function
|
|
235
|
+
function X(r) {
|
|
238
236
|
return r instanceof Error ? Object.getOwnPropertyDescriptor(
|
|
239
237
|
r,
|
|
240
|
-
|
|
238
|
+
j
|
|
241
239
|
)?.value === !0 : !1;
|
|
242
240
|
}
|
|
243
|
-
function
|
|
241
|
+
function Z(r) {
|
|
244
242
|
Promise.resolve(r).catch(() => {
|
|
245
243
|
});
|
|
246
244
|
}
|
|
247
|
-
function
|
|
245
|
+
function $(r, e) {
|
|
248
246
|
try {
|
|
249
247
|
const t = r();
|
|
250
|
-
return
|
|
251
|
-
|
|
248
|
+
return R(t) ? (Z(t), o(
|
|
249
|
+
d(Q()),
|
|
252
250
|
e
|
|
253
|
-
)) :
|
|
251
|
+
)) : i(t) ? o(t, e) : w(t) ? o(g(t), e) : f(t);
|
|
254
252
|
} catch (t) {
|
|
255
|
-
return o(
|
|
253
|
+
return o(d(t), e);
|
|
256
254
|
}
|
|
257
255
|
}
|
|
258
|
-
function
|
|
256
|
+
function v(r, e) {
|
|
259
257
|
return Promise.resolve(r).then(
|
|
260
|
-
(t) =>
|
|
261
|
-
(t) => o(
|
|
258
|
+
(t) => i(t) ? o(t, e) : w(t) ? o(g(t), e) : f(t),
|
|
259
|
+
(t) => o(d(t), e)
|
|
262
260
|
);
|
|
263
261
|
}
|
|
264
262
|
function o(r, e) {
|
|
265
|
-
if (r.status === u.Success ||
|
|
266
|
-
const t =
|
|
267
|
-
return t === null || r.error instanceof Error && e !== void 0 &&
|
|
268
|
-
}
|
|
269
|
-
function $(r) {
|
|
270
|
-
return r === void 0 ? null : L(r) ? er : rr(r) ? r.normalizeError : null;
|
|
271
|
-
}
|
|
272
|
-
function L(r) {
|
|
273
|
-
return !l(r) || Object.keys(r).length !== 1 ? !1 : Object.getOwnPropertyDescriptor(r, "mode")?.value === k.mode;
|
|
263
|
+
if (r.status === u.Success || X(r.error)) return r;
|
|
264
|
+
const t = rr(e);
|
|
265
|
+
return t === null || r.error instanceof Error && e !== void 0 && _(e) ? r : d(t(r.error));
|
|
274
266
|
}
|
|
275
267
|
function rr(r) {
|
|
276
|
-
return
|
|
268
|
+
return r === void 0 ? null : _(r) ? ur : er(r) ? r.normalizeError : null;
|
|
269
|
+
}
|
|
270
|
+
function _(r) {
|
|
271
|
+
return !c(r) || Object.keys(r).length !== 1 ? !1 : Object.getOwnPropertyDescriptor(r, "mode")?.value === k.mode;
|
|
277
272
|
}
|
|
278
273
|
function er(r) {
|
|
279
|
-
return
|
|
274
|
+
return c(r) ? E(r.normalizeError) : !1;
|
|
275
|
+
}
|
|
276
|
+
function tr(r) {
|
|
277
|
+
if (!c(r) || Array.isArray(r)) return !1;
|
|
278
|
+
const e = Object.getPrototypeOf(r);
|
|
279
|
+
return e === Object.prototype || e === null;
|
|
280
|
+
}
|
|
281
|
+
function h(r) {
|
|
282
|
+
try {
|
|
283
|
+
const e = JSON.stringify(r);
|
|
284
|
+
if (typeof e == "string") return e;
|
|
285
|
+
} catch {
|
|
286
|
+
return null;
|
|
287
|
+
}
|
|
288
|
+
return null;
|
|
289
|
+
}
|
|
290
|
+
function nr(r) {
|
|
291
|
+
if (Object.getPrototypeOf(r) === null) {
|
|
292
|
+
const n = h(r);
|
|
293
|
+
return n !== null ? n : Object.prototype.toString.call(r);
|
|
294
|
+
}
|
|
295
|
+
const e = String(r);
|
|
296
|
+
if (e !== "[object Object]") return e;
|
|
297
|
+
const t = h(r);
|
|
298
|
+
return t === null ? e : t;
|
|
299
|
+
}
|
|
300
|
+
function ur(r) {
|
|
301
|
+
return r instanceof Error ? r : Array.isArray(r) ? new AggregateError(r, "Multiple errors", { cause: r }) : tr(r) ? new Error(nr(r), { cause: r }) : new Error(String(r), { cause: r });
|
|
280
302
|
}
|
|
281
303
|
export {
|
|
282
304
|
u as FailableStatus,
|
|
283
305
|
k as NormalizedErrors,
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
306
|
+
dr as failable,
|
|
307
|
+
d as failure,
|
|
308
|
+
i as isFailable,
|
|
287
309
|
w as isFailableLike,
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
310
|
+
sr as isFailure,
|
|
311
|
+
ir as isSuccess,
|
|
312
|
+
lr as run,
|
|
313
|
+
f as success,
|
|
314
|
+
ar as throwIfError,
|
|
315
|
+
fr as toFailableLike
|
|
294
316
|
};
|
package/dist/lib/failable.d.ts
CHANGED
|
@@ -6,10 +6,10 @@ export type FailableStatus = (typeof FailableStatus)[keyof typeof FailableStatus
|
|
|
6
6
|
export declare const NormalizedErrors: Readonly<{
|
|
7
7
|
readonly mode: "normalized-errors";
|
|
8
8
|
}>;
|
|
9
|
-
export type
|
|
9
|
+
export type FailableNormalizeErrorOptions = {
|
|
10
10
|
readonly normalizeError: (error: unknown) => Error;
|
|
11
11
|
};
|
|
12
|
-
type
|
|
12
|
+
type FailableNormalizeErrorInput = typeof NormalizedErrors | FailableNormalizeErrorOptions;
|
|
13
13
|
type Match<T, E> = <U>(onSuccess: (data: T) => U, onFailure: (error: E) => U) => U;
|
|
14
14
|
export type Failable<T, E> = ((Success<T> & {
|
|
15
15
|
readonly match: Match<T, E>;
|
|
@@ -27,7 +27,7 @@ export type Failable<T, E> = ((Success<T> & {
|
|
|
27
27
|
*
|
|
28
28
|
* Boundary rule:
|
|
29
29
|
* - **sender**: `toFailableLike(result)`
|
|
30
|
-
* - **receiver**: `
|
|
30
|
+
* - **receiver**: `failable(message.result)` (rehydrates into a real {@link Failable})
|
|
31
31
|
*
|
|
32
32
|
* Note: `data` / `error` must themselves be structured-cloneable.
|
|
33
33
|
*/
|
|
@@ -50,7 +50,7 @@ export declare function isFailableLike(value: unknown): value is FailableLike<un
|
|
|
50
50
|
export type Success<T> = {
|
|
51
51
|
readonly status: typeof FailableStatus.Success;
|
|
52
52
|
readonly isSuccess: true;
|
|
53
|
-
readonly
|
|
53
|
+
readonly isFailure: false;
|
|
54
54
|
readonly data: T;
|
|
55
55
|
readonly error: null;
|
|
56
56
|
readonly or: <U>(value: U) => Success<T>;
|
|
@@ -63,7 +63,7 @@ export type Success<T> = {
|
|
|
63
63
|
export type Failure<E> = {
|
|
64
64
|
readonly status: typeof FailableStatus.Failure;
|
|
65
65
|
readonly isSuccess: false;
|
|
66
|
-
readonly
|
|
66
|
+
readonly isFailure: true;
|
|
67
67
|
readonly error: E;
|
|
68
68
|
readonly data: null;
|
|
69
69
|
readonly or: <U>(value: U) => Success<U>;
|
|
@@ -83,20 +83,20 @@ export declare function failure<E = void>(error: E): Failure<E>;
|
|
|
83
83
|
*
|
|
84
84
|
* Use this when you want control-flow narrowing without replacing the original variable.
|
|
85
85
|
* Use `result.getOrThrow()` when you need the success value itself in expression or return position.
|
|
86
|
-
* If you need `Error`-shaped failures, normalize earlier with `
|
|
86
|
+
* If you need `Error`-shaped failures, normalize earlier with `failable(...)`.
|
|
87
87
|
*/
|
|
88
88
|
export declare function throwIfError<T, E>(result: Failable<T, E>): asserts result is Success<T>;
|
|
89
89
|
export declare function toFailableLike<T>(value: Success<T>): FailableLikeSuccess<T>;
|
|
90
90
|
export declare function toFailableLike<E>(value: Failure<E>): FailableLikeFailure<E>;
|
|
91
91
|
export declare function toFailableLike<T, E>(value: Failable<T, E>): FailableLike<T, E>;
|
|
92
|
-
type
|
|
92
|
+
type InferFailableFromValue<T, E = unknown> = [T] extends [never] ? Failure<E> : T extends Success<infer A> ? Success<A> : T extends Failure<infer A> ? Failure<A> : T extends FailableLikeSuccess<infer A> ? Success<A> : T extends FailableLikeFailure<infer A> ? Failure<A> : T extends Failable<infer A, infer B> ? Failable<A, B> : T extends FailableLike<infer A, infer B> ? Failable<A, B> : Failable<T, E>;
|
|
93
93
|
type IsAny<T> = 0 extends 1 & T ? true : false;
|
|
94
94
|
type HasKnownPromiseLikeReturn<T> = IsAny<T> extends true ? false : unknown extends T ? false : [Extract<T, PromiseLike<unknown>>] extends [never] ? false : true;
|
|
95
|
-
type
|
|
96
|
-
readonly
|
|
95
|
+
type FailableSyncOnlyCallback<F extends () => unknown> = F & (HasKnownPromiseLikeReturn<ReturnType<F>> extends true ? {
|
|
96
|
+
readonly __failablePassPromiseDirectly: never;
|
|
97
97
|
} : unknown);
|
|
98
98
|
type InferReturnTypeFromPromise<T, E = unknown, P extends PromiseLike<T> = PromiseLike<T>> = [Awaited<P>] extends [never] ? Promise<Failure<E>> : Awaited<P> extends Success<infer A> ? Promise<Success<A>> : Awaited<P> extends Failure<infer A> ? Promise<Failure<A>> : Awaited<P> extends Failable<unknown, unknown> ? Promise<Awaited<P>> : Awaited<P> extends FailableLikeSuccess<infer A> ? Promise<Success<A>> : Awaited<P> extends FailableLikeFailure<infer A> ? Promise<Failure<A>> : Awaited<P> extends FailableLike<infer A, infer B> ? Promise<Failable<A, B>> : Promise<Failable<Awaited<P>, E>>;
|
|
99
|
-
type
|
|
99
|
+
type NormalizeFailableResult<T> = [T] extends [never] ? Failure<Error> : T extends Success<infer A> ? Success<A> : T extends Failure<unknown> ? Failure<Error> : T extends FailableLikeSuccess<infer A> ? Success<A> : T extends FailableLikeFailure<unknown> ? Failure<Error> : T extends Failable<infer A, unknown> ? Failable<A, Error> : T extends FailableLike<infer A, unknown> ? Failable<A, Error> : Failable<T, Error>;
|
|
100
100
|
declare const RUN_GET_TAG: unique symbol;
|
|
101
101
|
declare class RunGet<T, E, TSource = Failable<T, E>> {
|
|
102
102
|
readonly [RUN_GET_TAG] = true;
|
|
@@ -104,42 +104,64 @@ declare class RunGet<T, E, TSource = Failable<T, E>> {
|
|
|
104
104
|
private constructor();
|
|
105
105
|
static create<T, E, TSource extends Failable<T, E> | PromiseLike<Failable<T, E>>>(source: TSource): RunGet<T, E, TSource>;
|
|
106
106
|
}
|
|
107
|
-
type RunGetIterator<T, E> = Generator<RunGet<T, E>, T, unknown>;
|
|
107
|
+
type RunGetIterator<T, E, TSource extends Failable<T, E> = Failable<T, E>> = Generator<RunGet<T, E, TSource>, T, unknown>;
|
|
108
|
+
type AsyncRunGetIterator<T, E, TSource extends Failable<T, E> | PromiseLike<Failable<T, E>> = Failable<T, E> | PromiseLike<Failable<T, E>>> = AsyncGenerator<RunGet<T, E, TSource>, T, unknown>;
|
|
108
109
|
type RunHelpers = {
|
|
109
110
|
readonly get: {
|
|
110
|
-
<T>(source: Success<T>): RunGetIterator<T, never
|
|
111
|
-
<E>(source: Failure<E>): RunGetIterator<never, E
|
|
112
|
-
<T, E>(source: Failable<T, E>): RunGetIterator<T, E
|
|
113
|
-
<T>(source: PromiseLike<Success<T>>):
|
|
114
|
-
<E>(source: PromiseLike<Failure<E>>):
|
|
115
|
-
<T, E>(source: PromiseLike<Failable<T, E>>):
|
|
111
|
+
<T>(source: Success<T>): RunGetIterator<T, never, Success<T>>;
|
|
112
|
+
<E>(source: Failure<E>): RunGetIterator<never, E, Failure<E>>;
|
|
113
|
+
<T, E>(source: Failable<T, E>): RunGetIterator<T, E, Failable<T, E>>;
|
|
114
|
+
<T>(source: PromiseLike<Success<T>>): AsyncRunGetIterator<T, never, PromiseLike<Success<T>>>;
|
|
115
|
+
<E>(source: PromiseLike<Failure<E>>): AsyncRunGetIterator<never, E, PromiseLike<Failure<E>>>;
|
|
116
|
+
<T, E>(source: PromiseLike<Failable<T, E>>): AsyncRunGetIterator<T, E, PromiseLike<Failable<T, E>>>;
|
|
116
117
|
};
|
|
117
118
|
};
|
|
118
|
-
type RunYield = RunGet<unknown, unknown>;
|
|
119
|
+
type RunYield = RunGet<unknown, unknown, unknown>;
|
|
119
120
|
type RunReturn = void | Success<unknown> | Failure<unknown> | Failable<unknown, unknown>;
|
|
120
121
|
type InferRunYieldError<TYield> = TYield extends RunGet<unknown, infer TError, unknown> ? TError : never;
|
|
121
|
-
type
|
|
122
|
-
type
|
|
123
|
-
|
|
124
|
-
|
|
122
|
+
type InferRunGuaranteedFailureError<TYield> = TYield extends RunGet<unknown, infer TError, infer TSource> ? [TSource] extends [Failure<TError> | PromiseLike<Failure<TError>>] ? TError : never : never;
|
|
123
|
+
type RunReturnSuccessLike<TData = unknown> = {
|
|
124
|
+
readonly status: typeof FailableStatus.Success;
|
|
125
|
+
readonly data: TData;
|
|
126
|
+
readonly error: null;
|
|
127
|
+
};
|
|
128
|
+
type RunReturnFailureLike<TError = unknown> = {
|
|
129
|
+
readonly status: typeof FailableStatus.Failure;
|
|
130
|
+
readonly data: null;
|
|
131
|
+
readonly error: TError;
|
|
132
|
+
};
|
|
133
|
+
type MergeRunErrors<TYield, TError> = InferRunYieldError<TYield> | TError;
|
|
134
|
+
type InferRunSuccessResult<TYield, TData> = [InferRunYieldError<TYield>] extends [
|
|
135
|
+
never
|
|
136
|
+
] ? Success<TData> : Failable<TData, InferRunYieldError<TYield>>;
|
|
137
|
+
type InferRunNeverSuccessResult<TYield> = [InferRunYieldError<TYield>] extends [
|
|
138
|
+
never
|
|
139
|
+
] ? Success<never> : [InferRunGuaranteedFailureError<TYield>] extends [never] ? Failable<never, InferRunYieldError<TYield>> : Failure<InferRunYieldError<TYield>>;
|
|
140
|
+
type InferRunUnionReturnData<TResult> = ([Extract<TResult, void>] extends [never] ? never : void) | (Extract<TResult, RunReturnSuccessLike> extends {
|
|
141
|
+
readonly data: infer TData;
|
|
142
|
+
} ? TData : never);
|
|
143
|
+
type InferRunUnionReturnError<TResult> = Extract<TResult, RunReturnFailureLike> extends {
|
|
144
|
+
readonly error: infer TError;
|
|
145
|
+
} ? TError : never;
|
|
146
|
+
type InferRunResult<TYield, TResult> = [TResult] extends [never] ? [InferRunYieldError<TYield>] extends [never] ? never : Failure<InferRunYieldError<TYield>> : [TResult] extends [void] ? InferRunSuccessResult<TYield, void> : [TResult] extends [RunReturnSuccessLike<infer TData>] ? [TData] extends [never] ? InferRunNeverSuccessResult<TYield> : InferRunSuccessResult<TYield, TData> : [TResult] extends [RunReturnFailureLike<infer TError>] ? Failure<MergeRunErrors<TYield, TError>> : [MergeRunErrors<TYield, InferRunUnionReturnError<TResult>>] extends [never] ? Success<InferRunUnionReturnData<TResult>> : Failable<InferRunUnionReturnData<TResult>, MergeRunErrors<TYield, InferRunUnionReturnError<TResult>>>;
|
|
125
147
|
export declare function run<TYield extends RunGet<unknown, unknown, unknown> = never, TResult extends RunReturn = RunReturn>(builder: (helpers: RunHelpers) => AsyncGenerator<TYield, TResult, unknown>): Promise<InferRunResult<TYield, TResult>>;
|
|
126
148
|
export declare function run<TYield extends RunYield = never, TResult extends RunReturn = RunReturn>(builder: (helpers: RunHelpers) => Generator<TYield, TResult, unknown>): InferRunResult<TYield, TResult>;
|
|
127
|
-
export declare function
|
|
128
|
-
export declare function
|
|
129
|
-
export declare function
|
|
130
|
-
export declare function
|
|
131
|
-
export declare function
|
|
132
|
-
export declare function
|
|
133
|
-
export declare function
|
|
134
|
-
export declare function
|
|
135
|
-
export declare function
|
|
136
|
-
export declare function
|
|
137
|
-
export declare function
|
|
138
|
-
export declare function
|
|
149
|
+
export declare function failable<T>(value: Success<T>): Success<T>;
|
|
150
|
+
export declare function failable<E>(value: Failure<E>): Failure<E>;
|
|
151
|
+
export declare function failable<T, E>(value: Failable<T, E>): Failable<T, E>;
|
|
152
|
+
export declare function failable<T>(value: FailableLikeSuccess<T>): Success<T>;
|
|
153
|
+
export declare function failable<E>(value: FailableLikeFailure<E>): Failure<E>;
|
|
154
|
+
export declare function failable<T, E>(value: FailableLike<T, E>): Failable<T, E>;
|
|
155
|
+
export declare function failable<T>(value: Success<T>, normalizeOption: FailableNormalizeErrorInput): Success<T>;
|
|
156
|
+
export declare function failable<E>(value: Failure<E>, normalizeOption: FailableNormalizeErrorInput): Failure<Error>;
|
|
157
|
+
export declare function failable<T, E>(value: Failable<T, E>, normalizeOption: FailableNormalizeErrorInput): Failable<T, Error>;
|
|
158
|
+
export declare function failable<T>(value: FailableLikeSuccess<T>, normalizeOption: FailableNormalizeErrorInput): Success<T>;
|
|
159
|
+
export declare function failable<E>(value: FailableLikeFailure<E>, normalizeOption: FailableNormalizeErrorInput): Failure<Error>;
|
|
160
|
+
export declare function failable<T, E>(value: FailableLike<T, E>, normalizeOption: FailableNormalizeErrorInput): Failable<T, Error>;
|
|
139
161
|
/**
|
|
140
162
|
* Capture the boundary you actually have:
|
|
141
|
-
* - `
|
|
142
|
-
* - `await
|
|
163
|
+
* - `failable(() => value)` for synchronous callbacks that may throw
|
|
164
|
+
* - `await failable(promise)` for promise-based code that may reject
|
|
143
165
|
* - `run(...)` when the steps already return `Failable`
|
|
144
166
|
*
|
|
145
167
|
* In TypeScript, obviously promise-returning callbacks like `async () => ...` and
|
|
@@ -148,9 +170,9 @@ export declare function createFailable<T, E>(value: FailableLike<T, E>, normaliz
|
|
|
148
170
|
* them to pass the promise directly instead. That guard error is preserved even when
|
|
149
171
|
* a custom `normalizeError` callback is provided.
|
|
150
172
|
*/
|
|
151
|
-
export declare function
|
|
152
|
-
export declare function
|
|
153
|
-
export declare function
|
|
154
|
-
export declare function
|
|
173
|
+
export declare function failable<T, P extends PromiseLike<T> = PromiseLike<T>>(promise: P, normalizeOption: FailableNormalizeErrorInput): Promise<NormalizeFailableResult<Awaited<P>>>;
|
|
174
|
+
export declare function failable<T, E = unknown, P extends PromiseLike<T> = PromiseLike<T>>(promise: P): InferReturnTypeFromPromise<T, E, P>;
|
|
175
|
+
export declare function failable<F extends () => unknown>(fun: FailableSyncOnlyCallback<F>, normalizeOption: FailableNormalizeErrorInput): NormalizeFailableResult<ReturnType<F>>;
|
|
176
|
+
export declare function failable<F extends () => unknown, E = unknown>(fun: FailableSyncOnlyCallback<F>): InferFailableFromValue<ReturnType<F>, E>;
|
|
155
177
|
export {};
|
|
156
178
|
//# sourceMappingURL=failable.d.ts.map
|