retuple 0.0.1 → 1.0.0-next.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,518 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _ResultAsync_inner;
13
+ export class RetupleUnwrapFailed extends Error {
14
+ constructor(value, msg = "Unwrap failed") {
15
+ super(msg, value instanceof Error ? { cause: value } : undefined);
16
+ this.value = value;
17
+ }
18
+ }
19
+ export class RetupleUnwrapErrFailed extends Error {
20
+ constructor(value, msg = "Unwrap error failed") {
21
+ super(msg);
22
+ this.value = value;
23
+ }
24
+ }
25
+ export class RetupleExpectFailed extends Error {
26
+ constructor(value) {
27
+ super("Expect failed");
28
+ this.value = value;
29
+ }
30
+ }
31
+ export class RetupleThrownValueError extends Error {
32
+ constructor(value) {
33
+ super("Caught value was not an instance of Error");
34
+ this.value = value;
35
+ }
36
+ }
37
+ /**
38
+ * ## Result
39
+ *
40
+ * @TODO
41
+ */
42
+ export const Result = {
43
+ Ok,
44
+ Err,
45
+ from,
46
+ safe,
47
+ safeAsync,
48
+ safePromise,
49
+ };
50
+ export default Result;
51
+ export function Ok(val) {
52
+ return new ResultOk(val);
53
+ }
54
+ export function Err(err) {
55
+ return new ResultErr(err);
56
+ }
57
+ export function from(value, error) {
58
+ if (value) {
59
+ return new ResultOk(value);
60
+ }
61
+ if (error) {
62
+ return new ResultErr(error());
63
+ }
64
+ return new ResultErr(true);
65
+ }
66
+ export function safe(f, mapError = ensureError) {
67
+ try {
68
+ return Ok(f());
69
+ }
70
+ catch (err) {
71
+ return Err(mapError(err));
72
+ }
73
+ }
74
+ export function safeAsync(f, mapError = ensureError) {
75
+ return new ResultAsync((async () => {
76
+ try {
77
+ return Ok(await f());
78
+ }
79
+ catch (err) {
80
+ return Err(await mapError(err));
81
+ }
82
+ })());
83
+ }
84
+ export function safePromise(promise, mapError = ensureError) {
85
+ return new ResultAsync(promise.then((Ok), async (err) => Err(await mapError(err))));
86
+ }
87
+ /**
88
+ * ## Ok
89
+ *
90
+ * @TODO
91
+ */
92
+ class ResultOk extends Array {
93
+ constructor(value) {
94
+ super(2);
95
+ this[0] = undefined;
96
+ this[1] = value;
97
+ }
98
+ $value() {
99
+ return this[1];
100
+ }
101
+ $isOk() {
102
+ return true;
103
+ }
104
+ $isOkAnd(f) {
105
+ return f(this[1]);
106
+ }
107
+ $isErr() {
108
+ return false;
109
+ }
110
+ $isErrAnd() {
111
+ return false;
112
+ }
113
+ $expect() {
114
+ return this[1];
115
+ }
116
+ $unwrap() {
117
+ return this[1];
118
+ }
119
+ $unwrapErr(msg) {
120
+ throw new RetupleUnwrapErrFailed(this[1], msg);
121
+ }
122
+ $unwrapOr() {
123
+ return this[1];
124
+ }
125
+ $unwrapOrElse() {
126
+ return this[1];
127
+ }
128
+ $map(f) {
129
+ return new ResultOk(f(this[1]));
130
+ }
131
+ $mapErr() {
132
+ return this;
133
+ }
134
+ $mapOr(_def, f) {
135
+ return new ResultOk(f(this[1]));
136
+ }
137
+ $mapOrElse(_def, f) {
138
+ return new ResultOk(f(this[1]));
139
+ }
140
+ $or() {
141
+ return this;
142
+ }
143
+ $orElse() {
144
+ return this;
145
+ }
146
+ $orSafe() {
147
+ return this;
148
+ }
149
+ $and(and) {
150
+ return and;
151
+ }
152
+ $andThen(f) {
153
+ return f(this[1]);
154
+ }
155
+ $andThrough(f) {
156
+ const res = f(this[1]);
157
+ return res instanceof ResultErr ? res : this;
158
+ }
159
+ $andSafe(f, mapError = ensureError) {
160
+ try {
161
+ return new ResultOk(f(this[1]));
162
+ }
163
+ catch (err) {
164
+ return new ResultErr(mapError(err));
165
+ }
166
+ }
167
+ $peek(f) {
168
+ f(this);
169
+ return this;
170
+ }
171
+ $tap(f) {
172
+ f(this[1]);
173
+ return this;
174
+ }
175
+ $tapErr() {
176
+ return this;
177
+ }
178
+ $flatten() {
179
+ return this[1];
180
+ }
181
+ $async() {
182
+ return new ResultAsync(Promise.resolve(this));
183
+ }
184
+ $promise() {
185
+ return Promise.resolve(this);
186
+ }
187
+ }
188
+ /**
189
+ * ## Err
190
+ *
191
+ * @TODO
192
+ */
193
+ class ResultErr extends Array {
194
+ constructor(err) {
195
+ super(2);
196
+ this[0] = err;
197
+ this[1] = undefined;
198
+ }
199
+ $value() {
200
+ return this[0];
201
+ }
202
+ $isOk() {
203
+ return false;
204
+ }
205
+ $isOkAnd() {
206
+ return false;
207
+ }
208
+ $isErr() {
209
+ return true;
210
+ }
211
+ $isErrAnd(f) {
212
+ return f(this[0]);
213
+ }
214
+ $expect() {
215
+ if (this[0] instanceof Error) {
216
+ throw this[0];
217
+ }
218
+ throw new RetupleExpectFailed(this[0]);
219
+ }
220
+ $unwrap(msg) {
221
+ throw new RetupleUnwrapFailed(this[0], msg);
222
+ }
223
+ $unwrapErr() {
224
+ return this[0];
225
+ }
226
+ $unwrapOr(def) {
227
+ return def;
228
+ }
229
+ $unwrapOrElse(f) {
230
+ return f();
231
+ }
232
+ $map() {
233
+ return this;
234
+ }
235
+ $mapErr(f) {
236
+ return new ResultErr(f(this[0]));
237
+ }
238
+ $mapOr(def) {
239
+ return new ResultOk(def);
240
+ }
241
+ $mapOrElse(def) {
242
+ return new ResultOk(def(this[0]));
243
+ }
244
+ $or(or) {
245
+ return or;
246
+ }
247
+ $orElse(f) {
248
+ return f(this[0]);
249
+ }
250
+ $orSafe(f, mapError = ensureError) {
251
+ try {
252
+ return new ResultOk(f(this[0]));
253
+ }
254
+ catch (err) {
255
+ return new ResultErr(mapError(err));
256
+ }
257
+ }
258
+ $and() {
259
+ return this;
260
+ }
261
+ $andThen() {
262
+ return this;
263
+ }
264
+ $andThrough() {
265
+ return this;
266
+ }
267
+ $andSafe() {
268
+ return this;
269
+ }
270
+ $peek(f) {
271
+ f(this);
272
+ return this;
273
+ }
274
+ $tap() {
275
+ return this;
276
+ }
277
+ $tapErr(f) {
278
+ f(this[0]);
279
+ return this;
280
+ }
281
+ $flatten() {
282
+ return this;
283
+ }
284
+ $async() {
285
+ return new ResultAsync(Promise.resolve(this));
286
+ }
287
+ $promise() {
288
+ return Promise.resolve(this);
289
+ }
290
+ }
291
+ /**
292
+ * ## ResultAsync
293
+ *
294
+ * @TODO
295
+ */
296
+ class ResultAsync {
297
+ constructor(inner) {
298
+ _ResultAsync_inner.set(this, void 0);
299
+ __classPrivateFieldSet(this, _ResultAsync_inner, inner, "f");
300
+ }
301
+ then(onfulfilled, onrejected) {
302
+ return __classPrivateFieldGet(this, _ResultAsync_inner, "f").then(onfulfilled, onrejected);
303
+ }
304
+ /**
305
+ * @TODO
306
+ */
307
+ async $value() {
308
+ return (await __classPrivateFieldGet(this, _ResultAsync_inner, "f")).$value();
309
+ }
310
+ /**
311
+ * @TODO
312
+ */
313
+ async $expect() {
314
+ return (await __classPrivateFieldGet(this, _ResultAsync_inner, "f")).$expect();
315
+ }
316
+ /**
317
+ * @TODO
318
+ */
319
+ async $unwrap(msg) {
320
+ return (await __classPrivateFieldGet(this, _ResultAsync_inner, "f")).$unwrap(msg);
321
+ }
322
+ /**
323
+ * @TODO
324
+ */
325
+ async $unwrapErr(msg) {
326
+ return (await __classPrivateFieldGet(this, _ResultAsync_inner, "f")).$unwrapErr(msg);
327
+ }
328
+ /**
329
+ * @TODO
330
+ */
331
+ async $unwrapOr(def) {
332
+ return (await __classPrivateFieldGet(this, _ResultAsync_inner, "f")).$unwrapOr(def);
333
+ }
334
+ /**
335
+ * @TODO
336
+ */
337
+ async $unwrapOrElse(f) {
338
+ const res = await __classPrivateFieldGet(this, _ResultAsync_inner, "f");
339
+ return res instanceof ResultOk ? res[1] : f();
340
+ }
341
+ /**
342
+ * @TODO
343
+ */
344
+ $map(f) {
345
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
346
+ return res instanceof ResultOk
347
+ ? new ResultOk(f(res[1]))
348
+ : res;
349
+ }));
350
+ }
351
+ /**
352
+ * @TODO
353
+ */
354
+ $mapErr(f) {
355
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
356
+ return res instanceof ResultErr
357
+ ? new ResultErr(f(res[0]))
358
+ : res;
359
+ }));
360
+ }
361
+ /**
362
+ * @TODO
363
+ */
364
+ $mapOr(def, f) {
365
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
366
+ return res instanceof ResultOk
367
+ ? new ResultOk(f(res[1]))
368
+ : new ResultOk(def);
369
+ }));
370
+ }
371
+ /**
372
+ * @TODO
373
+ */
374
+ $mapOrElse(def, f) {
375
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
376
+ return res instanceof ResultOk
377
+ ? new ResultOk(f(res[1]))
378
+ : new ResultOk(def(res[0]));
379
+ }));
380
+ }
381
+ /**
382
+ * @TODO
383
+ */
384
+ $or(or) {
385
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
386
+ return res instanceof ResultErr ? await or : res;
387
+ }));
388
+ }
389
+ /**
390
+ * @TODO
391
+ */
392
+ $orElse(f) {
393
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
394
+ return res instanceof ResultErr ? await f(res[0]) : res;
395
+ }));
396
+ }
397
+ /**
398
+ * @TODO
399
+ */
400
+ $orSafe(f, mapError = ensureError) {
401
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
402
+ if (res instanceof ResultOk) {
403
+ return res;
404
+ }
405
+ try {
406
+ return new ResultOk(await f(res[0]));
407
+ }
408
+ catch (err) {
409
+ return new ResultErr(mapError(err));
410
+ }
411
+ }));
412
+ }
413
+ /**
414
+ * @TODO
415
+ */
416
+ $and(and) {
417
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
418
+ return res instanceof ResultOk ? await and : res;
419
+ }));
420
+ }
421
+ /**
422
+ * @TODO
423
+ */
424
+ $andThen(f) {
425
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
426
+ return res instanceof ResultOk ? await f(res[1]) : res;
427
+ }));
428
+ }
429
+ /**
430
+ * @TODO
431
+ */
432
+ $andThrough(f) {
433
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
434
+ if (res instanceof ResultOk) {
435
+ const through = await f(res[1]);
436
+ if (through instanceof ResultErr) {
437
+ return through;
438
+ }
439
+ }
440
+ return res;
441
+ }));
442
+ }
443
+ /**
444
+ * @TODO
445
+ */
446
+ $andSafe(f, mapError = ensureError) {
447
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
448
+ if (res instanceof ResultErr) {
449
+ return res;
450
+ }
451
+ try {
452
+ return new ResultOk(await f(res[1]));
453
+ }
454
+ catch (err) {
455
+ return new ResultErr(mapError(err));
456
+ }
457
+ }));
458
+ }
459
+ /**
460
+ * @TODO
461
+ */
462
+ $peek(f) {
463
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
464
+ await f(res);
465
+ return res;
466
+ }));
467
+ }
468
+ /**
469
+ * @TODO
470
+ */
471
+ $tap(f) {
472
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
473
+ if (res instanceof ResultOk) {
474
+ await f(res[1]);
475
+ }
476
+ return res;
477
+ }));
478
+ }
479
+ /**
480
+ * @TODO
481
+ */
482
+ $tapErr(f) {
483
+ return new ResultAsync(__classPrivateFieldGet(this, _ResultAsync_inner, "f").then(async (res) => {
484
+ if (res instanceof ResultErr) {
485
+ await f(res[0]);
486
+ }
487
+ return res;
488
+ }));
489
+ }
490
+ /**
491
+ * @TODO
492
+ */
493
+ $promise() {
494
+ return Promise.resolve(this);
495
+ }
496
+ }
497
+ _ResultAsync_inner = new WeakMap();
498
+ function ensureError(err) {
499
+ if (err instanceof Error) {
500
+ return err;
501
+ }
502
+ return new RetupleThrownValueError(err);
503
+ }
504
+ Object.freeze(Result);
505
+ Object.freeze(ResultOk);
506
+ Object.freeze(ResultErr);
507
+ Object.freeze(ResultAsync);
508
+ Object.freeze(RetupleUnwrapFailed);
509
+ Object.freeze(RetupleUnwrapErrFailed);
510
+ Object.freeze(RetupleExpectFailed);
511
+ Object.freeze(RetupleThrownValueError);
512
+ Object.freeze(ResultOk.prototype);
513
+ Object.freeze(ResultErr.prototype);
514
+ Object.freeze(ResultAsync.prototype);
515
+ Object.freeze(RetupleUnwrapFailed.prototype);
516
+ Object.freeze(RetupleUnwrapErrFailed.prototype);
517
+ Object.freeze(RetupleExpectFailed.prototype);
518
+ Object.freeze(RetupleThrownValueError.prototype);
package/package.json CHANGED
@@ -1,13 +1,51 @@
1
1
  {
2
2
  "name": "retuple",
3
- "version": "0.0.1",
4
- "description": "An errors-as-values library for TypeScript",
3
+ "version": "1.0.0-next.1",
4
+ "scripts": {
5
+ "test": "vitest",
6
+ "lint": "eslint . --ext .ts -c eslint.config.mjs --fix",
7
+ "build": "zshy",
8
+ "coverage": "vitest run --coverage && open './coverage/index.html'"
9
+ },
10
+ "type": "module",
11
+ "main": "./dist/index.cjs",
12
+ "types": "./dist/index.d.cts",
13
+ "module": "./dist/index.js",
14
+ "zshy": "./src/index.ts",
5
15
  "keywords": [
6
- "result",
7
- "monad",
8
16
  "error",
9
- "handling"
17
+ "handling",
18
+ "safe",
19
+ "result",
20
+ "throw",
21
+ "monad"
10
22
  ],
11
23
  "author": "Matthew Wilson",
12
- "license": "MIT"
24
+ "license": "MIT",
25
+ "description": "A strongly typed errors as values library built around tuples.",
26
+ "repository": {
27
+ "type": "git",
28
+ "url": "git+https://github.com/traverse1984/retuple.git"
29
+ },
30
+ "devDependencies": {
31
+ "typescript": "^5.9.2",
32
+ "zshy": "^0.4.1",
33
+ "vitest": "^3.2.4",
34
+ "@vitest/coverage-v8": "^3.2.4",
35
+ "eslint": "^9.35.0",
36
+ "eslint-config-prettier": "^10.1.8",
37
+ "eslint-plugin-prettier": "^5.5.4",
38
+ "@typescript-eslint/eslint-plugin": "^8.43.0",
39
+ "@typescript-eslint/parser": "^8.43.0"
40
+ },
41
+ "exports": {
42
+ ".": {
43
+ "types": "./dist/index.d.cts",
44
+ "import": "./dist/index.js",
45
+ "require": "./dist/index.cjs"
46
+ }
47
+ },
48
+ "files": [
49
+ "dist"
50
+ ]
13
51
  }