@onrails/result 0.4.2 → 0.5.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.
@@ -1,12 +1,86 @@
1
- // src/internal/ctor.ts
2
- var mkOk = (value) => ({
3
- _tag: "Ok",
4
- value
5
- });
6
- var mkErr = (error) => ({
7
- _tag: "Err",
8
- error
9
- });
1
+ // src/internal/proto.ts
2
+ var INSPECT = /* @__PURE__ */ Symbol.for("nodejs.util.inspect.custom");
3
+ var OkImpl = class _OkImpl {
4
+ _tag;
5
+ value;
6
+ // explicit assignment order keeps `_tag` first, so JSON key order matches the plain-data shape
7
+ constructor(value) {
8
+ this._tag = "Ok";
9
+ this.value = value;
10
+ }
11
+ [INSPECT](_depth, options, inspect) {
12
+ return `Ok(${inspect(this.value, options)})`;
13
+ }
14
+ map(fn) {
15
+ return new _OkImpl(fn(this.value));
16
+ }
17
+ mapErr(_fn) {
18
+ return new _OkImpl(this.value);
19
+ }
20
+ flatMap(fn) {
21
+ return fn(this.value);
22
+ }
23
+ andThen(fn) {
24
+ return fn(this.value);
25
+ }
26
+ recover(_fn) {
27
+ return new _OkImpl(this.value);
28
+ }
29
+ tap(fn) {
30
+ fn(this.value);
31
+ return this;
32
+ }
33
+ tapErr(_fn) {
34
+ return this;
35
+ }
36
+ match(onOk, _onErr) {
37
+ return onOk(this.value);
38
+ }
39
+ unwrapOr(_defaultValue) {
40
+ return this.value;
41
+ }
42
+ };
43
+ var ErrImpl = class _ErrImpl {
44
+ _tag;
45
+ error;
46
+ constructor(error) {
47
+ this._tag = "Err";
48
+ this.error = error;
49
+ }
50
+ [INSPECT](_depth, options, inspect) {
51
+ return `Err(${inspect(this.error, options)})`;
52
+ }
53
+ map(_fn) {
54
+ return new _ErrImpl(this.error);
55
+ }
56
+ mapErr(fn) {
57
+ return new _ErrImpl(fn(this.error));
58
+ }
59
+ flatMap(_fn) {
60
+ return new _ErrImpl(this.error);
61
+ }
62
+ andThen(_fn) {
63
+ return new _ErrImpl(this.error);
64
+ }
65
+ recover(fn) {
66
+ return fn(this.error);
67
+ }
68
+ tap(_fn) {
69
+ return this;
70
+ }
71
+ tapErr(fn) {
72
+ fn(this.error);
73
+ return this;
74
+ }
75
+ match(_onOk, onErr) {
76
+ return onErr(this.error);
77
+ }
78
+ unwrapOr(defaultValue) {
79
+ return defaultValue;
80
+ }
81
+ };
82
+ var newOk = (value) => new OkImpl(value);
83
+ var newErr = (error) => new ErrImpl(error);
10
84
 
11
85
  // src/internal/dual.ts
12
86
  var dual = (arity, body) => {
@@ -20,30 +94,22 @@ var isOk = (result) => result._tag === "Ok";
20
94
  var isErr = (result) => result._tag === "Err";
21
95
  var map = dual(
22
96
  2,
23
- (result, fn) => isOk(result) ? mkOk(fn(result.value)) : mkErr(result.error)
97
+ (result, fn) => isOk(result) ? newOk(fn(result.value)) : newErr(result.error)
24
98
  );
25
99
  var mapErr = dual(
26
100
  2,
27
- (result, fn) => isErr(result) ? mkErr(fn(result.error)) : mkOk(result.value)
101
+ (result, fn) => isErr(result) ? newErr(fn(result.error)) : newOk(result.value)
28
102
  );
29
103
  var bimap = dual(
30
104
  3,
31
- (result, onOk, onErr) => isOk(result) ? mkOk(onOk(result.value)) : mkErr(onErr(result.error))
32
- );
33
- var flatMap = dual(
34
- 2,
35
- (result, fn) => isOk(result) ? fn(result.value) : mkErr(result.error)
36
- );
37
- var unwrapOr = dual(
38
- 2,
39
- (result, defaultValue) => isOk(result) ? result.value : defaultValue
105
+ (result, onOk, onErr) => isOk(result) ? newOk(onOk(result.value)) : newErr(onErr(result.error))
40
106
  );
41
107
  function fromThrowable(fn, onThrow) {
42
108
  return (...args) => {
43
109
  try {
44
- return mkOk(fn(...args));
110
+ return newOk(fn(...args));
45
111
  } catch (error) {
46
- return mkErr(onThrow(error));
112
+ return newErr(onThrow(error));
47
113
  }
48
114
  };
49
115
  }
@@ -63,11 +129,11 @@ var sequenceSettled = (settled) => {
63
129
  const values = [];
64
130
  for (const result of settled) {
65
131
  if (isErr(result)) {
66
- return mkErr(result.error);
132
+ return newErr(result.error);
67
133
  }
68
134
  values.push(result.value);
69
135
  }
70
- return mkOk(values);
136
+ return newOk(values);
71
137
  };
72
138
  var ResultAsync = class _ResultAsync {
73
139
  constructor(run) {
@@ -104,9 +170,9 @@ var ResultAsync = class _ResultAsync {
104
170
  static fromPromise(promise, onReject) {
105
171
  return new _ResultAsync(async () => {
106
172
  try {
107
- return mkOk(await promise);
173
+ return newOk(await promise);
108
174
  } catch (error) {
109
- return mkErr(onReject(error));
175
+ return newErr(onReject(error));
110
176
  }
111
177
  });
112
178
  }
@@ -120,7 +186,7 @@ var ResultAsync = class _ResultAsync {
120
186
  * ```
121
187
  */
122
188
  static fromSafePromise(promise) {
123
- return new _ResultAsync(async () => mkOk(await promise));
189
+ return new _ResultAsync(async () => newOk(await promise));
124
190
  }
125
191
  /**
126
192
  * Defers work until {@link resolve}. Unlike {@link fromPromise}, the factory
@@ -138,13 +204,13 @@ var ResultAsync = class _ResultAsync {
138
204
  return new _ResultAsync(fn);
139
205
  }
140
206
  static ok(value) {
141
- return new _ResultAsync(async () => mkOk(value));
207
+ return new _ResultAsync(async () => newOk(value));
142
208
  }
143
209
  static of(value) {
144
210
  return _ResultAsync.ok(value);
145
211
  }
146
212
  static err(error) {
147
- return new _ResultAsync(async () => mkErr(error));
213
+ return new _ResultAsync(async () => newErr(error));
148
214
  }
149
215
  /**
150
216
  * Lifts an existing `Promise<Result<T, E>>` (e.g. from interop code) into a
@@ -162,7 +228,7 @@ var ResultAsync = class _ResultAsync {
162
228
  try {
163
229
  return await promise;
164
230
  } catch (error) {
165
- return mkErr(mapDefect(error));
231
+ return newErr(mapDefect(error));
166
232
  }
167
233
  });
168
234
  }
@@ -184,11 +250,11 @@ var ResultAsync = class _ResultAsync {
184
250
  for (const ra of results) {
185
251
  const result = await ra.resolve();
186
252
  if (isErr(result)) {
187
- return mkErr(result.error);
253
+ return newErr(result.error);
188
254
  }
189
255
  values.push(result.value);
190
256
  }
191
- return mkOk(values);
257
+ return newOk(values);
192
258
  });
193
259
  }
194
260
  /**
@@ -283,7 +349,7 @@ var ResultAsync = class _ResultAsync {
283
349
  return new _ResultAsync(async () => {
284
350
  const first = await this.resolve();
285
351
  if (isErr(first)) {
286
- return first;
352
+ return newErr(first.error);
287
353
  }
288
354
  const next = fn(first.value);
289
355
  return next instanceof _ResultAsync ? next.resolve() : next;
@@ -315,7 +381,7 @@ var ResultAsync = class _ResultAsync {
315
381
  return new _ResultAsync(async () => {
316
382
  const first = await this.resolve();
317
383
  if (!isErr(first)) {
318
- return first;
384
+ return newOk(first.value);
319
385
  }
320
386
  const next = fn(first.error);
321
387
  return next instanceof _ResultAsync ? next.resolve() : next;
@@ -436,15 +502,29 @@ var ResultAsync = class _ResultAsync {
436
502
  var combine = (results) => {
437
503
  const values = [];
438
504
  for (const result of results) {
439
- if (isErr(result)) return mkErr(result.error);
505
+ if (isErr(result)) return newErr(result.error);
440
506
  values.push(result.value);
441
507
  }
442
- return mkOk(values);
508
+ return newOk(values);
443
509
  };
444
510
  var combineTuple = (results, ..._guard) => (
445
511
  // Runtime identical to combine; the cast restores per-index tuple types.
512
+ // `unknown` hop: the tuple type is computed from R, which TS cannot relate to the runtime array.
446
513
  combine(results)
447
514
  );
515
+ function validateAll(results, combineErrors) {
516
+ const values = [];
517
+ const errors = [];
518
+ for (const result of results) {
519
+ if (isErr(result)) {
520
+ errors.push(result.error);
521
+ } else {
522
+ values.push(result.value);
523
+ }
524
+ }
525
+ if (errors.length === 0) return newOk(values);
526
+ return newErr(errors);
527
+ }
448
528
 
449
529
  // src/compat/neverthrow.ts
450
530
  var CompatResult = class _CompatResult {
@@ -461,11 +541,12 @@ var CompatResult = class _CompatResult {
461
541
  combineTuple(results.map((r) => r.inner))
462
542
  );
463
543
  }
464
- get value() {
465
- return this._unsafeUnwrap();
466
- }
467
- get error() {
468
- return this._unsafeUnwrapErr();
544
+ // The `as unknown as` casts below restore per-index tuple types computed from R, which TS cannot
545
+ // relate to the runtime arrays.
546
+ static combineWithAllErrors(results) {
547
+ return new _CompatResult(
548
+ validateAll(results.map((r) => r.inner))
549
+ );
469
550
  }
470
551
  isOk() {
471
552
  return isOk(this.inner);
@@ -474,25 +555,68 @@ var CompatResult = class _CompatResult {
474
555
  return isErr(this.inner);
475
556
  }
476
557
  map(fn) {
477
- return new _CompatResult(map(this.inner, fn));
558
+ return new _CompatResult(this.inner.map(fn));
478
559
  }
479
560
  mapErr(fn) {
480
- return new _CompatResult(mapErr(this.inner, fn));
561
+ return new _CompatResult(this.inner.mapErr(fn));
481
562
  }
482
563
  andThen(fn) {
483
- return new _CompatResult(flatMap(this.inner, (value) => fn(value).inner));
564
+ return new _CompatResult(this.inner.flatMap((value) => fn(value).inner));
484
565
  }
485
566
  asyncAndThen(fn) {
486
567
  return isErr(this.inner) ? CompatResultAsync.err(this.inner.error) : CompatResultAsync.fromInner(coerceToCoreAsync(fn(this.inner.value)));
487
568
  }
488
569
  orElse(fn) {
489
- return isOk(this.inner) ? new _CompatResult(this.inner) : fn(this.inner.error);
570
+ return isOk(this.inner) ? new _CompatResult(newOk(this.inner.value)) : fn(this.inner.error);
490
571
  }
491
572
  match(onOk, onErr) {
492
573
  return isOk(this.inner) ? onOk(this.inner.value) : onErr(this.inner.error);
493
574
  }
494
575
  unwrapOr(defaultValue) {
495
- return unwrapOr(this.inner, defaultValue);
576
+ return this.inner.unwrapOr(defaultValue);
577
+ }
578
+ andTee(fn) {
579
+ if (isOk(this.inner)) {
580
+ try {
581
+ fn(this.inner.value);
582
+ } catch {
583
+ }
584
+ }
585
+ return this;
586
+ }
587
+ orTee(fn) {
588
+ if (isErr(this.inner)) {
589
+ try {
590
+ fn(this.inner.error);
591
+ } catch {
592
+ }
593
+ }
594
+ return this;
595
+ }
596
+ andThrough(fn) {
597
+ if (isErr(this.inner)) return this;
598
+ const through = fn(this.inner.value).inner;
599
+ return isErr(through) ? new _CompatResult(newErr(through.error)) : this;
600
+ }
601
+ asyncAndThrough(fn) {
602
+ const inner = this.inner;
603
+ return CompatResultAsync.fromInner(
604
+ ResultAsync.defer(async () => {
605
+ if (isErr(inner)) return inner;
606
+ const through = await coerceToCoreAsync(fn(inner.value)).resolve();
607
+ return isErr(through) ? newErr(through.error) : inner;
608
+ })
609
+ );
610
+ }
611
+ asyncMap(fn) {
612
+ return isErr(this.inner) ? CompatResultAsync.err(this.inner.error) : CompatResultAsync.fromSafePromise(fn(this.inner.value));
613
+ }
614
+ /** Yields the `Err` to {@link safeTry} on failure; returns the `Ok` value otherwise. */
615
+ *safeUnwrap() {
616
+ if (isErr(this.inner)) {
617
+ yield new _CompatResult(newErr(this.inner.error));
618
+ }
619
+ return this._unsafeUnwrap();
496
620
  }
497
621
  _unsafeUnwrap() {
498
622
  if (isErr(this.inner)) {
@@ -508,8 +632,34 @@ var CompatResult = class _CompatResult {
508
632
  }
509
633
  };
510
634
  var Result = CompatResult;
511
- var ok = (value) => new CompatResult(mkOk(value));
512
- var err = (error) => new CompatResult(mkErr(error));
635
+ var ok = (value) => new CompatResult(newOk(value));
636
+ var err = (error) => new CompatResult(newErr(error));
637
+ Object.defineProperty(CompatResult.prototype, "value", {
638
+ get() {
639
+ return this._unsafeUnwrap();
640
+ }
641
+ });
642
+ Object.defineProperty(CompatResult.prototype, "error", {
643
+ get() {
644
+ return this._unsafeUnwrapErr();
645
+ }
646
+ });
647
+ var Ok = class extends CompatResult {
648
+ constructor(value) {
649
+ super(newOk(value));
650
+ }
651
+ static [Symbol.hasInstance](candidate) {
652
+ return candidate instanceof CompatResult && isOk(candidate.inner);
653
+ }
654
+ };
655
+ var Err = class extends CompatResult {
656
+ constructor(error) {
657
+ super(newErr(error));
658
+ }
659
+ static [Symbol.hasInstance](candidate) {
660
+ return candidate instanceof CompatResult && isErr(candidate.inner);
661
+ }
662
+ };
513
663
  var CompatResultAsync = class _CompatResultAsync {
514
664
  constructor(inner) {
515
665
  this.inner = inner;
@@ -541,6 +691,13 @@ var CompatResultAsync = class _CompatResultAsync {
541
691
  ResultAsync.combine(results.map((r) => r.inner))
542
692
  );
543
693
  }
694
+ static combineWithAllErrors(results) {
695
+ return new _CompatResultAsync(
696
+ ResultAsync.defer(
697
+ async () => validateAll(await Promise.all(results.map((r) => r.resolve())))
698
+ )
699
+ );
700
+ }
544
701
  // biome-ignore lint/suspicious/noThenProperty: thenable shim for `await ra` -> CompatResult
545
702
  then(onfulfilled, onrejected) {
546
703
  return this.inner.resolve().then((r) => {
@@ -605,6 +762,21 @@ var CompatResultAsync = class _CompatResultAsync {
605
762
  })
606
763
  );
607
764
  }
765
+ andThrough(fn) {
766
+ return new _CompatResultAsync(
767
+ ResultAsync.defer(async () => {
768
+ const r = await this.inner.resolve();
769
+ if (isErr(r)) return r;
770
+ const next = coerceToCore(fn(r.value));
771
+ const through = next instanceof ResultAsync ? await next.resolve() : next;
772
+ return isErr(through) ? newErr(through.error) : r;
773
+ })
774
+ );
775
+ }
776
+ /** Async twin of {@link CompatResult.safeUnwrap}. */
777
+ async *safeUnwrap() {
778
+ return yield* new CompatResult(await this.inner.resolve()).safeUnwrap();
779
+ }
608
780
  orTee(fn) {
609
781
  return new _CompatResultAsync(
610
782
  ResultAsync.defer(async () => {
@@ -627,11 +799,20 @@ function coerceToCore(next) {
627
799
  return next;
628
800
  }
629
801
  var coerceToCoreAsync = (next) => next instanceof CompatResultAsync ? next.toCore() : next;
802
+ function safeTry(body) {
803
+ const step = body().next();
804
+ if (step instanceof Promise) {
805
+ return CompatResultAsync.fromInner(ResultAsync.defer(async () => (await step).value.inner));
806
+ }
807
+ return step.value;
808
+ }
630
809
  var okAsync = CompatResultAsync.ok;
631
810
  var errAsync = CompatResultAsync.err;
632
811
  var fromPromise = CompatResultAsync.fromPromise;
633
812
  var fromSafePromise = CompatResultAsync.fromSafePromise;
813
+ var fromThrowable2 = CompatResult.fromThrowable;
814
+ var fromAsyncThrowable = CompatResultAsync.fromThrowable;
634
815
 
635
- export { CompatResult, CompatResultAsync, Result, CompatResultAsync as ResultAsync, err, errAsync, fromPromise, fromSafePromise, ok, okAsync };
816
+ export { CompatResult, CompatResultAsync, Err, Ok, Result, CompatResultAsync as ResultAsync, err, errAsync, fromAsyncThrowable, fromPromise, fromSafePromise, fromThrowable2 as fromThrowable, ok, okAsync, safeTry };
636
817
  //# sourceMappingURL=neverthrow.js.map
637
818
  //# sourceMappingURL=neverthrow.js.map