go-go-try 7.4.0 → 7.4.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/README.md +45 -4
- package/dist/index.cjs +29 -3
- package/dist/index.d.cts +31 -6
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts +31 -6
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +29 -3
- package/package.json +1 -1
- package/src/goTryAll.ts +55 -11
- package/src/index.test.ts +87 -2
- package/src/index.ts +1 -0
- package/src/types.ts +10 -0
package/README.md
CHANGED
|
@@ -408,15 +408,50 @@ const [errors, results] = await goTryAll([
|
|
|
408
408
|
// - Limit expensive computation resources
|
|
409
409
|
```
|
|
410
410
|
|
|
411
|
-
### `goTryAllRaw<T>(items, options?)`
|
|
411
|
+
### `goTryAllRaw<T, E>(items, options?)`
|
|
412
412
|
|
|
413
413
|
Like `goTryAll`, but returns raw Error objects instead of error messages.
|
|
414
|
+
Non-tagged errors are wrapped in `UnknownError` by default (consistent with `goTryRaw`).
|
|
415
|
+
Tagged errors pass through unchanged.
|
|
416
|
+
|
|
417
|
+
Supports the same `errorClass` and `systemErrorClass` options as `goTryRaw`, plus `concurrency` control.
|
|
414
418
|
|
|
415
419
|
```ts
|
|
416
|
-
|
|
420
|
+
interface GoTryAllRawOptions<E> {
|
|
421
|
+
concurrency?: number
|
|
422
|
+
// errorClass and systemErrorClass are mutually exclusive
|
|
423
|
+
errorClass?: ErrorConstructor<E> // Wrap ALL errors
|
|
424
|
+
systemErrorClass?: ErrorConstructor<E> // Only wrap non-tagged errors
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
function goTryAllRaw<T extends readonly unknown[], E = UnknownError>(
|
|
417
428
|
items: { [K in keyof T]: Promise<T[K]> | (() => Promise<T[K]>) },
|
|
418
|
-
options?:
|
|
419
|
-
): Promise<[{ [K in keyof T]:
|
|
429
|
+
options?: GoTryAllRawOptions<E>
|
|
430
|
+
): Promise<[{ [K in keyof T]: E | undefined }, { [K in keyof T]: T[K] | undefined }]>
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
**Example:**
|
|
434
|
+
```ts
|
|
435
|
+
const DatabaseError = taggedError('DatabaseError')
|
|
436
|
+
|
|
437
|
+
// Default behavior - non-tagged errors wrapped in UnknownError
|
|
438
|
+
const [errors1] = await goTryAllRaw([
|
|
439
|
+
fetchUser(1),
|
|
440
|
+
fetchUser(2),
|
|
441
|
+
])
|
|
442
|
+
|
|
443
|
+
// Wrap all errors in DatabaseError
|
|
444
|
+
const [errors2] = await goTryAllRaw([
|
|
445
|
+
fetchUser(1),
|
|
446
|
+
fetchUser(2),
|
|
447
|
+
], { errorClass: DatabaseError })
|
|
448
|
+
|
|
449
|
+
// Combine concurrency control with errorClass
|
|
450
|
+
const [errors3] = await goTryAllRaw([
|
|
451
|
+
() => fetchUser(1),
|
|
452
|
+
() => fetchUser(2),
|
|
453
|
+
() => fetchUser(3),
|
|
454
|
+
], { concurrency: 2, errorClass: DatabaseError })
|
|
420
455
|
```
|
|
421
456
|
|
|
422
457
|
### `goTryOr<T>(value, defaultValue)`
|
|
@@ -591,6 +626,12 @@ type GoTryRawOptions<E> =
|
|
|
591
626
|
| { errorClass: ErrorConstructor<E>; systemErrorClass?: never }
|
|
592
627
|
| { errorClass?: never; systemErrorClass: ErrorConstructor<E> }
|
|
593
628
|
| { errorClass?: never; systemErrorClass?: never }
|
|
629
|
+
|
|
630
|
+
// Options for goTryAllRaw (includes concurrency + error class options)
|
|
631
|
+
type GoTryAllRawOptions<E> =
|
|
632
|
+
| { concurrency?: number; errorClass: ErrorConstructor<E>; systemErrorClass?: never }
|
|
633
|
+
| { concurrency?: number; errorClass?: never; systemErrorClass: ErrorConstructor<E> }
|
|
634
|
+
| { concurrency?: number; errorClass?: never; systemErrorClass?: never }
|
|
594
635
|
```
|
|
595
636
|
|
|
596
637
|
## License
|
package/dist/index.cjs
CHANGED
|
@@ -63,7 +63,7 @@ function taggedError(tag) {
|
|
|
63
63
|
|
|
64
64
|
const UnknownError = taggedError("UnknownError");
|
|
65
65
|
|
|
66
|
-
function isTaggedError(err) {
|
|
66
|
+
function isTaggedError$1(err) {
|
|
67
67
|
return isError(err) && "_tag" in err && typeof err._tag === "string";
|
|
68
68
|
}
|
|
69
69
|
function goTryRaw(value, options) {
|
|
@@ -80,7 +80,7 @@ function goTryRaw(value, options) {
|
|
|
80
80
|
return new errorClass(String(err));
|
|
81
81
|
}
|
|
82
82
|
if (actualSystemErrorClass) {
|
|
83
|
-
if (isTaggedError(err)) {
|
|
83
|
+
if (isTaggedError$1(err)) {
|
|
84
84
|
return err;
|
|
85
85
|
}
|
|
86
86
|
if (err === void 0) {
|
|
@@ -119,6 +119,31 @@ function goTryOr(value, defaultValue) {
|
|
|
119
119
|
}
|
|
120
120
|
}
|
|
121
121
|
|
|
122
|
+
function isTaggedError(err) {
|
|
123
|
+
return isError(err) && "_tag" in err && typeof err._tag === "string";
|
|
124
|
+
}
|
|
125
|
+
function wrapError(err, errorClass, systemErrorClass) {
|
|
126
|
+
if (errorClass) {
|
|
127
|
+
if (err === void 0) {
|
|
128
|
+
return new errorClass("undefined");
|
|
129
|
+
}
|
|
130
|
+
if (isError(err)) {
|
|
131
|
+
return new errorClass(err.message, { cause: err });
|
|
132
|
+
}
|
|
133
|
+
return new errorClass(String(err));
|
|
134
|
+
}
|
|
135
|
+
const actualSystemErrorClass = systemErrorClass ?? UnknownError;
|
|
136
|
+
if (isTaggedError(err)) {
|
|
137
|
+
return err;
|
|
138
|
+
}
|
|
139
|
+
if (err === void 0) {
|
|
140
|
+
return new actualSystemErrorClass("undefined");
|
|
141
|
+
}
|
|
142
|
+
if (isError(err)) {
|
|
143
|
+
return new actualSystemErrorClass(err.message, { cause: err });
|
|
144
|
+
}
|
|
145
|
+
return new actualSystemErrorClass(String(err));
|
|
146
|
+
}
|
|
122
147
|
async function runWithConcurrency(items, concurrency) {
|
|
123
148
|
if (items.length === 0) {
|
|
124
149
|
return [];
|
|
@@ -166,6 +191,7 @@ async function goTryAll(items, options) {
|
|
|
166
191
|
return [errors, results];
|
|
167
192
|
}
|
|
168
193
|
async function goTryAllRaw(items, options) {
|
|
194
|
+
const { errorClass, systemErrorClass } = options || {};
|
|
169
195
|
const settled = await runWithConcurrency(items, options?.concurrency ?? 0);
|
|
170
196
|
const errors = [];
|
|
171
197
|
const results = [];
|
|
@@ -176,7 +202,7 @@ async function goTryAllRaw(items, options) {
|
|
|
176
202
|
results[i] = item.value;
|
|
177
203
|
} else {
|
|
178
204
|
const reason = item.reason;
|
|
179
|
-
errors[i] =
|
|
205
|
+
errors[i] = wrapError(reason, errorClass, systemErrorClass);
|
|
180
206
|
results[i] = void 0;
|
|
181
207
|
}
|
|
182
208
|
}
|
package/dist/index.d.cts
CHANGED
|
@@ -42,6 +42,24 @@ type GoTryRawOptions<E = Error> = {
|
|
|
42
42
|
errorClass?: never;
|
|
43
43
|
systemErrorClass?: never;
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Options for goTryAllRaw function.
|
|
47
|
+
* Includes concurrency control and error class options.
|
|
48
|
+
* errorClass and systemErrorClass are mutually exclusive.
|
|
49
|
+
*/
|
|
50
|
+
type GoTryAllRawOptions<E = Error> = {
|
|
51
|
+
concurrency?: number;
|
|
52
|
+
errorClass: ErrorConstructor<E>;
|
|
53
|
+
systemErrorClass?: never;
|
|
54
|
+
} | {
|
|
55
|
+
concurrency?: number;
|
|
56
|
+
errorClass?: never;
|
|
57
|
+
systemErrorClass: ErrorConstructor<E>;
|
|
58
|
+
} | {
|
|
59
|
+
concurrency?: number;
|
|
60
|
+
errorClass?: never;
|
|
61
|
+
systemErrorClass?: never;
|
|
62
|
+
};
|
|
45
63
|
/**
|
|
46
64
|
* Creates a union type from multiple tagged error classes.
|
|
47
65
|
*
|
|
@@ -227,18 +245,25 @@ declare function goTryAll<T extends readonly unknown[]>(items: {
|
|
|
227
245
|
}]>;
|
|
228
246
|
/**
|
|
229
247
|
* Like `goTryAll`, but returns raw Error objects instead of error messages.
|
|
248
|
+
* Non-tagged errors are wrapped in `UnknownError` by default (consistent with `goTryRaw`).
|
|
249
|
+
* Tagged errors pass through unchanged.
|
|
250
|
+
*
|
|
251
|
+
* Supports `errorClass` and `systemErrorClass` options (mutually exclusive):
|
|
252
|
+
* - `errorClass`: Wrap ALL errors in the specified class
|
|
253
|
+
* - `systemErrorClass`: Only wrap non-tagged errors (defaults to UnknownError)
|
|
230
254
|
*
|
|
231
255
|
* @template T The tuple type of all promise results
|
|
256
|
+
* @template E The type of the error
|
|
232
257
|
* @param {readonly [...{ [K in keyof T]: Promise<T[K]> | (() => Promise<T[K]>) }]} items - Array of promises or factories
|
|
233
|
-
* @param {
|
|
234
|
-
* @returns {Promise<[{ [K in keyof T]:
|
|
258
|
+
* @param {GoTryAllRawOptions<E>} options - Optional configuration
|
|
259
|
+
* @returns {Promise<[{ [K in keyof T]: E | undefined }, { [K in keyof T]: T[K] | undefined }]>}
|
|
235
260
|
* A tuple where the first element is a tuple of Error objects (or undefined) and
|
|
236
261
|
* the second element is a tuple of results (or undefined), preserving input order
|
|
237
262
|
*/
|
|
238
|
-
declare function goTryAllRaw<T extends readonly unknown[]
|
|
263
|
+
declare function goTryAllRaw<T extends readonly unknown[], E = InstanceType<typeof UnknownError>>(items: {
|
|
239
264
|
[K in keyof T]: Promise<T[K]> | (() => Promise<T[K]>);
|
|
240
|
-
}, options?:
|
|
241
|
-
[K in keyof T]:
|
|
265
|
+
}, options?: GoTryAllRawOptions<E>): Promise<[{
|
|
266
|
+
[K in keyof T]: E | undefined;
|
|
242
267
|
}, {
|
|
243
268
|
[K in keyof T]: T[K] | undefined;
|
|
244
269
|
}]>;
|
|
@@ -351,5 +376,5 @@ declare function failure<E>(error: E): Failure<E>;
|
|
|
351
376
|
declare function assertNever(value: never): never;
|
|
352
377
|
|
|
353
378
|
export { UnknownError, assert, assertNever, failure, goTry, goTryAll, goTryAllRaw, goTryOr, goTryRaw, isFailure, isSuccess, success, taggedError };
|
|
354
|
-
export type { ErrorConstructor, Failure, GoTryAllOptions, GoTryRawOptions, MaybePromise, Result, ResultWithDefault, Success, TaggedError, TaggedUnion };
|
|
379
|
+
export type { ErrorConstructor, Failure, GoTryAllOptions, GoTryAllRawOptions, GoTryRawOptions, MaybePromise, Result, ResultWithDefault, Success, TaggedError, TaggedUnion };
|
|
355
380
|
//# sourceMappingURL=index.d.cts.map
|
package/dist/index.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.cts","sources":["../src/types.ts","../src/goTry.ts","../src/unknown-error.ts","../src/goTryRaw.ts","../src/goTryOr.ts","../src/goTryAll.ts","../src/tagged-error.ts","../src/assert.ts","../src/result-helpers.ts"],"mappings":"AAAA;;;AAIM,KAAM,OAAO;AACb,KAAM,OAAO;AACb,KAAM,MAAM,SAAS,OAAO,MAAM,OAAO;AAEzC,KAAM,iBAAiB;AAEvB,KAAM,YAAY,UAAU,OAAO;AAEzC;;;;AAIM,UAAW,WAAW;;;;;AAMtB,UAAW,eAAe;;;;;;;AAQhC;;;AAGM,KAAM,gBAAgB;;;AAO5B;;;;AAIM,KAAM,eAAe,KAAK,KAAK;gBACnB,gBAAgB;;;;sBACU,gBAAgB;;;;;AAG5D;;;;;;;;;;;;;AAaM,KAAM,WAAW,oBAAoB,gBAAgB;iCAC1B,gBAAgB;;;
|
|
1
|
+
{"version":3,"file":"index.d.cts","sources":["../src/types.ts","../src/goTry.ts","../src/unknown-error.ts","../src/goTryRaw.ts","../src/goTryOr.ts","../src/goTryAll.ts","../src/tagged-error.ts","../src/assert.ts","../src/result-helpers.ts"],"mappings":"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","names":[]}
|
package/dist/index.d.mts
CHANGED
|
@@ -42,6 +42,24 @@ type GoTryRawOptions<E = Error> = {
|
|
|
42
42
|
errorClass?: never;
|
|
43
43
|
systemErrorClass?: never;
|
|
44
44
|
};
|
|
45
|
+
/**
|
|
46
|
+
* Options for goTryAllRaw function.
|
|
47
|
+
* Includes concurrency control and error class options.
|
|
48
|
+
* errorClass and systemErrorClass are mutually exclusive.
|
|
49
|
+
*/
|
|
50
|
+
type GoTryAllRawOptions<E = Error> = {
|
|
51
|
+
concurrency?: number;
|
|
52
|
+
errorClass: ErrorConstructor<E>;
|
|
53
|
+
systemErrorClass?: never;
|
|
54
|
+
} | {
|
|
55
|
+
concurrency?: number;
|
|
56
|
+
errorClass?: never;
|
|
57
|
+
systemErrorClass: ErrorConstructor<E>;
|
|
58
|
+
} | {
|
|
59
|
+
concurrency?: number;
|
|
60
|
+
errorClass?: never;
|
|
61
|
+
systemErrorClass?: never;
|
|
62
|
+
};
|
|
45
63
|
/**
|
|
46
64
|
* Creates a union type from multiple tagged error classes.
|
|
47
65
|
*
|
|
@@ -227,18 +245,25 @@ declare function goTryAll<T extends readonly unknown[]>(items: {
|
|
|
227
245
|
}]>;
|
|
228
246
|
/**
|
|
229
247
|
* Like `goTryAll`, but returns raw Error objects instead of error messages.
|
|
248
|
+
* Non-tagged errors are wrapped in `UnknownError` by default (consistent with `goTryRaw`).
|
|
249
|
+
* Tagged errors pass through unchanged.
|
|
250
|
+
*
|
|
251
|
+
* Supports `errorClass` and `systemErrorClass` options (mutually exclusive):
|
|
252
|
+
* - `errorClass`: Wrap ALL errors in the specified class
|
|
253
|
+
* - `systemErrorClass`: Only wrap non-tagged errors (defaults to UnknownError)
|
|
230
254
|
*
|
|
231
255
|
* @template T The tuple type of all promise results
|
|
256
|
+
* @template E The type of the error
|
|
232
257
|
* @param {readonly [...{ [K in keyof T]: Promise<T[K]> | (() => Promise<T[K]>) }]} items - Array of promises or factories
|
|
233
|
-
* @param {
|
|
234
|
-
* @returns {Promise<[{ [K in keyof T]:
|
|
258
|
+
* @param {GoTryAllRawOptions<E>} options - Optional configuration
|
|
259
|
+
* @returns {Promise<[{ [K in keyof T]: E | undefined }, { [K in keyof T]: T[K] | undefined }]>}
|
|
235
260
|
* A tuple where the first element is a tuple of Error objects (or undefined) and
|
|
236
261
|
* the second element is a tuple of results (or undefined), preserving input order
|
|
237
262
|
*/
|
|
238
|
-
declare function goTryAllRaw<T extends readonly unknown[]
|
|
263
|
+
declare function goTryAllRaw<T extends readonly unknown[], E = InstanceType<typeof UnknownError>>(items: {
|
|
239
264
|
[K in keyof T]: Promise<T[K]> | (() => Promise<T[K]>);
|
|
240
|
-
}, options?:
|
|
241
|
-
[K in keyof T]:
|
|
265
|
+
}, options?: GoTryAllRawOptions<E>): Promise<[{
|
|
266
|
+
[K in keyof T]: E | undefined;
|
|
242
267
|
}, {
|
|
243
268
|
[K in keyof T]: T[K] | undefined;
|
|
244
269
|
}]>;
|
|
@@ -351,5 +376,5 @@ declare function failure<E>(error: E): Failure<E>;
|
|
|
351
376
|
declare function assertNever(value: never): never;
|
|
352
377
|
|
|
353
378
|
export { UnknownError, assert, assertNever, failure, goTry, goTryAll, goTryAllRaw, goTryOr, goTryRaw, isFailure, isSuccess, success, taggedError };
|
|
354
|
-
export type { ErrorConstructor, Failure, GoTryAllOptions, GoTryRawOptions, MaybePromise, Result, ResultWithDefault, Success, TaggedError, TaggedUnion };
|
|
379
|
+
export type { ErrorConstructor, Failure, GoTryAllOptions, GoTryAllRawOptions, GoTryRawOptions, MaybePromise, Result, ResultWithDefault, Success, TaggedError, TaggedUnion };
|
|
355
380
|
//# sourceMappingURL=index.d.mts.map
|
package/dist/index.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","sources":["../src/types.ts","../src/goTry.ts","../src/unknown-error.ts","../src/goTryRaw.ts","../src/goTryOr.ts","../src/goTryAll.ts","../src/tagged-error.ts","../src/assert.ts","../src/result-helpers.ts"],"mappings":"AAAA;;;AAIM,KAAM,OAAO;AACb,KAAM,OAAO;AACb,KAAM,MAAM,SAAS,OAAO,MAAM,OAAO;AAEzC,KAAM,iBAAiB;AAEvB,KAAM,YAAY,UAAU,OAAO;AAEzC;;;;AAIM,UAAW,WAAW;;;;;AAMtB,UAAW,eAAe;;;;;;;AAQhC;;;AAGM,KAAM,gBAAgB;;;AAO5B;;;;AAIM,KAAM,eAAe,KAAK,KAAK;gBACnB,gBAAgB;;;;sBACU,gBAAgB;;;;;AAG5D;;;;;;;;;;;;;AAaM,KAAM,WAAW,oBAAoB,gBAAgB;iCAC1B,gBAAgB;;;
|
|
1
|
+
{"version":3,"file":"index.d.mts","sources":["../src/types.ts","../src/goTry.ts","../src/unknown-error.ts","../src/goTryRaw.ts","../src/goTryOr.ts","../src/goTryAll.ts","../src/tagged-error.ts","../src/assert.ts","../src/result-helpers.ts"],"mappings":"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","names":[]}
|
package/dist/index.mjs
CHANGED
|
@@ -61,7 +61,7 @@ function taggedError(tag) {
|
|
|
61
61
|
|
|
62
62
|
const UnknownError = taggedError("UnknownError");
|
|
63
63
|
|
|
64
|
-
function isTaggedError(err) {
|
|
64
|
+
function isTaggedError$1(err) {
|
|
65
65
|
return isError(err) && "_tag" in err && typeof err._tag === "string";
|
|
66
66
|
}
|
|
67
67
|
function goTryRaw(value, options) {
|
|
@@ -78,7 +78,7 @@ function goTryRaw(value, options) {
|
|
|
78
78
|
return new errorClass(String(err));
|
|
79
79
|
}
|
|
80
80
|
if (actualSystemErrorClass) {
|
|
81
|
-
if (isTaggedError(err)) {
|
|
81
|
+
if (isTaggedError$1(err)) {
|
|
82
82
|
return err;
|
|
83
83
|
}
|
|
84
84
|
if (err === void 0) {
|
|
@@ -117,6 +117,31 @@ function goTryOr(value, defaultValue) {
|
|
|
117
117
|
}
|
|
118
118
|
}
|
|
119
119
|
|
|
120
|
+
function isTaggedError(err) {
|
|
121
|
+
return isError(err) && "_tag" in err && typeof err._tag === "string";
|
|
122
|
+
}
|
|
123
|
+
function wrapError(err, errorClass, systemErrorClass) {
|
|
124
|
+
if (errorClass) {
|
|
125
|
+
if (err === void 0) {
|
|
126
|
+
return new errorClass("undefined");
|
|
127
|
+
}
|
|
128
|
+
if (isError(err)) {
|
|
129
|
+
return new errorClass(err.message, { cause: err });
|
|
130
|
+
}
|
|
131
|
+
return new errorClass(String(err));
|
|
132
|
+
}
|
|
133
|
+
const actualSystemErrorClass = systemErrorClass ?? UnknownError;
|
|
134
|
+
if (isTaggedError(err)) {
|
|
135
|
+
return err;
|
|
136
|
+
}
|
|
137
|
+
if (err === void 0) {
|
|
138
|
+
return new actualSystemErrorClass("undefined");
|
|
139
|
+
}
|
|
140
|
+
if (isError(err)) {
|
|
141
|
+
return new actualSystemErrorClass(err.message, { cause: err });
|
|
142
|
+
}
|
|
143
|
+
return new actualSystemErrorClass(String(err));
|
|
144
|
+
}
|
|
120
145
|
async function runWithConcurrency(items, concurrency) {
|
|
121
146
|
if (items.length === 0) {
|
|
122
147
|
return [];
|
|
@@ -164,6 +189,7 @@ async function goTryAll(items, options) {
|
|
|
164
189
|
return [errors, results];
|
|
165
190
|
}
|
|
166
191
|
async function goTryAllRaw(items, options) {
|
|
192
|
+
const { errorClass, systemErrorClass } = options || {};
|
|
167
193
|
const settled = await runWithConcurrency(items, options?.concurrency ?? 0);
|
|
168
194
|
const errors = [];
|
|
169
195
|
const results = [];
|
|
@@ -174,7 +200,7 @@ async function goTryAllRaw(items, options) {
|
|
|
174
200
|
results[i] = item.value;
|
|
175
201
|
} else {
|
|
176
202
|
const reason = item.reason;
|
|
177
|
-
errors[i] =
|
|
203
|
+
errors[i] = wrapError(reason, errorClass, systemErrorClass);
|
|
178
204
|
results[i] = void 0;
|
|
179
205
|
}
|
|
180
206
|
}
|
package/package.json
CHANGED
package/src/goTryAll.ts
CHANGED
|
@@ -1,5 +1,43 @@
|
|
|
1
|
-
import type { GoTryAllOptions } from './types.js'
|
|
1
|
+
import type { GoTryAllOptions, GoTryAllRawOptions, ErrorConstructor } from './types.js'
|
|
2
2
|
import { isError, getErrorMessage, type PromiseFactory } from './internals.js'
|
|
3
|
+
import { UnknownError } from './unknown-error.js'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Checks if a value is a tagged error (has a _tag property).
|
|
7
|
+
*/
|
|
8
|
+
function isTaggedError(err: unknown): err is { _tag: string } {
|
|
9
|
+
return isError(err) && '_tag' in err && typeof (err as { _tag?: unknown })._tag === 'string'
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Wraps an error based on the provided options (errorClass/systemErrorClass).
|
|
14
|
+
* Consistent with goTryRaw behavior.
|
|
15
|
+
*/
|
|
16
|
+
function wrapError<E>(err: unknown, errorClass: ErrorConstructor<E> | undefined, systemErrorClass: ErrorConstructor<E> | undefined): E {
|
|
17
|
+
// If errorClass is specified, wrap all errors with it
|
|
18
|
+
if (errorClass) {
|
|
19
|
+
if (err === undefined) {
|
|
20
|
+
return new errorClass('undefined')
|
|
21
|
+
}
|
|
22
|
+
if (isError(err)) {
|
|
23
|
+
return new errorClass(err.message, { cause: err })
|
|
24
|
+
}
|
|
25
|
+
return new errorClass(String(err))
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// If systemErrorClass is specified (or defaulted to UnknownError), only wrap non-tagged errors
|
|
29
|
+
const actualSystemErrorClass = systemErrorClass ?? UnknownError
|
|
30
|
+
if (isTaggedError(err)) {
|
|
31
|
+
return err as unknown as E
|
|
32
|
+
}
|
|
33
|
+
if (err === undefined) {
|
|
34
|
+
return new actualSystemErrorClass('undefined') as unknown as E
|
|
35
|
+
}
|
|
36
|
+
if (isError(err)) {
|
|
37
|
+
return new actualSystemErrorClass(err.message, { cause: err }) as unknown as E
|
|
38
|
+
}
|
|
39
|
+
return new actualSystemErrorClass(String(err)) as unknown as E
|
|
40
|
+
}
|
|
3
41
|
|
|
4
42
|
async function runWithConcurrency<T extends readonly unknown[]>(
|
|
5
43
|
items: { [K in keyof T]: Promise<T[K]> | PromiseFactory<T[K]> },
|
|
@@ -106,33 +144,39 @@ export async function goTryAll<T extends readonly unknown[]>(
|
|
|
106
144
|
|
|
107
145
|
/**
|
|
108
146
|
* Like `goTryAll`, but returns raw Error objects instead of error messages.
|
|
147
|
+
* Non-tagged errors are wrapped in `UnknownError` by default (consistent with `goTryRaw`).
|
|
148
|
+
* Tagged errors pass through unchanged.
|
|
149
|
+
*
|
|
150
|
+
* Supports `errorClass` and `systemErrorClass` options (mutually exclusive):
|
|
151
|
+
* - `errorClass`: Wrap ALL errors in the specified class
|
|
152
|
+
* - `systemErrorClass`: Only wrap non-tagged errors (defaults to UnknownError)
|
|
109
153
|
*
|
|
110
154
|
* @template T The tuple type of all promise results
|
|
155
|
+
* @template E The type of the error
|
|
111
156
|
* @param {readonly [...{ [K in keyof T]: Promise<T[K]> | (() => Promise<T[K]>) }]} items - Array of promises or factories
|
|
112
|
-
* @param {
|
|
113
|
-
* @returns {Promise<[{ [K in keyof T]:
|
|
157
|
+
* @param {GoTryAllRawOptions<E>} options - Optional configuration
|
|
158
|
+
* @returns {Promise<[{ [K in keyof T]: E | undefined }, { [K in keyof T]: T[K] | undefined }]>}
|
|
114
159
|
* A tuple where the first element is a tuple of Error objects (or undefined) and
|
|
115
160
|
* the second element is a tuple of results (or undefined), preserving input order
|
|
116
161
|
*/
|
|
117
|
-
export async function goTryAllRaw<T extends readonly unknown[]
|
|
162
|
+
export async function goTryAllRaw<T extends readonly unknown[], E = InstanceType<typeof UnknownError>>(
|
|
118
163
|
items: { [K in keyof T]: Promise<T[K]> | (() => Promise<T[K]>) },
|
|
119
|
-
options?:
|
|
120
|
-
): Promise<[{ [K in keyof T]:
|
|
164
|
+
options?: GoTryAllRawOptions<E>,
|
|
165
|
+
): Promise<[{ [K in keyof T]: E | undefined }, { [K in keyof T]: T[K] | undefined }]> {
|
|
166
|
+
const { errorClass, systemErrorClass } = options || {}
|
|
121
167
|
const settled = await runWithConcurrency(items, options?.concurrency ?? 0)
|
|
122
168
|
|
|
123
|
-
const errors = [] as { [K in keyof T]:
|
|
169
|
+
const errors = [] as { [K in keyof T]: E | undefined }
|
|
124
170
|
const results = [] as { [K in keyof T]: T[K] | undefined }
|
|
125
171
|
|
|
126
172
|
for (let i = 0; i < settled.length; i++) {
|
|
127
173
|
const item = settled[i]!
|
|
128
174
|
if (item.status === 'fulfilled') {
|
|
129
|
-
;(errors as (
|
|
175
|
+
;(errors as (E | undefined)[])[i] = undefined
|
|
130
176
|
;(results as unknown[])[i] = (item as PromiseFulfilledResult<T[number]>).value
|
|
131
177
|
} else {
|
|
132
178
|
const reason = (item as PromiseRejectedResult).reason
|
|
133
|
-
;(errors as (
|
|
134
|
-
? reason
|
|
135
|
-
: new Error(String(reason))
|
|
179
|
+
;(errors as (E | undefined)[])[i] = wrapError(reason, errorClass, systemErrorClass)
|
|
136
180
|
;(results as unknown[])[i] = undefined
|
|
137
181
|
}
|
|
138
182
|
}
|
package/src/index.test.ts
CHANGED
|
@@ -1107,7 +1107,7 @@ describe('goTryAllRaw', () => {
|
|
|
1107
1107
|
assert.deepEqual(results, ['a', 42, true])
|
|
1108
1108
|
})
|
|
1109
1109
|
|
|
1110
|
-
test('
|
|
1110
|
+
test('wraps non-tagged errors in UnknownError', async () => {
|
|
1111
1111
|
const [errors, results] = await goTryAllRaw([
|
|
1112
1112
|
Promise.resolve('success'),
|
|
1113
1113
|
Promise.reject(new Error('fail1')),
|
|
@@ -1115,6 +1115,8 @@ describe('goTryAllRaw', () => {
|
|
|
1115
1115
|
])
|
|
1116
1116
|
|
|
1117
1117
|
assert.equal(errors[0], undefined)
|
|
1118
|
+
assert.ok(errors[1] instanceof UnknownError)
|
|
1119
|
+
assert.equal(errors[1]?._tag, 'UnknownError')
|
|
1118
1120
|
assert.equal(errors[1]?.message, 'fail1')
|
|
1119
1121
|
assert.equal(errors[2], undefined)
|
|
1120
1122
|
|
|
@@ -1123,15 +1125,44 @@ describe('goTryAllRaw', () => {
|
|
|
1123
1125
|
assert.equal(results[2], 42)
|
|
1124
1126
|
})
|
|
1125
1127
|
|
|
1126
|
-
test('
|
|
1128
|
+
test('tagged errors pass through unchanged', async () => {
|
|
1129
|
+
const DatabaseError = taggedError('DatabaseError')
|
|
1130
|
+
const NetworkError = taggedError('NetworkError')
|
|
1131
|
+
|
|
1132
|
+
const [errors] = await goTryAllRaw([
|
|
1133
|
+
Promise.reject(new DatabaseError('db failed')),
|
|
1134
|
+
Promise.reject(new NetworkError('network timeout')),
|
|
1135
|
+
Promise.reject(new Error('plain error')),
|
|
1136
|
+
])
|
|
1137
|
+
|
|
1138
|
+
// Tagged errors pass through
|
|
1139
|
+
assert.ok(errors[0] instanceof DatabaseError)
|
|
1140
|
+
assert.equal(errors[0]?._tag, 'DatabaseError')
|
|
1141
|
+
assert.equal(errors[0]?.message, 'db failed')
|
|
1142
|
+
assert.ok(errors[1] instanceof NetworkError)
|
|
1143
|
+
assert.equal(errors[1]?._tag, 'NetworkError')
|
|
1144
|
+
assert.equal(errors[1]?.message, 'network timeout')
|
|
1145
|
+
// Non-tagged errors get wrapped in UnknownError
|
|
1146
|
+
assert.ok(errors[2] instanceof UnknownError)
|
|
1147
|
+
assert.equal(errors[2]?._tag, 'UnknownError')
|
|
1148
|
+
assert.equal(errors[2]?.message, 'plain error')
|
|
1149
|
+
})
|
|
1150
|
+
|
|
1151
|
+
test('converts non-Error rejections to UnknownError objects', async () => {
|
|
1127
1152
|
const [errors] = await goTryAllRaw([
|
|
1128
1153
|
Promise.reject('string error'),
|
|
1129
1154
|
Promise.reject(42),
|
|
1130
1155
|
Promise.reject(undefined),
|
|
1131
1156
|
])
|
|
1132
1157
|
|
|
1158
|
+
assert.ok(errors[0] instanceof UnknownError)
|
|
1159
|
+
assert.equal(errors[0]?._tag, 'UnknownError')
|
|
1133
1160
|
assert.equal(errors[0]?.message, 'string error')
|
|
1161
|
+
assert.ok(errors[1] instanceof UnknownError)
|
|
1162
|
+
assert.equal(errors[1]?._tag, 'UnknownError')
|
|
1134
1163
|
assert.equal(errors[1]?.message, '42')
|
|
1164
|
+
assert.ok(errors[2] instanceof UnknownError)
|
|
1165
|
+
assert.equal(errors[2]?._tag, 'UnknownError')
|
|
1135
1166
|
assert.equal(errors[2]?.message, 'undefined')
|
|
1136
1167
|
})
|
|
1137
1168
|
|
|
@@ -1141,6 +1172,60 @@ describe('goTryAllRaw', () => {
|
|
|
1141
1172
|
assert.deepEqual(errors, [])
|
|
1142
1173
|
assert.deepEqual(results, [])
|
|
1143
1174
|
})
|
|
1175
|
+
|
|
1176
|
+
test('errorClass wraps all errors', async () => {
|
|
1177
|
+
const DatabaseError = taggedError('DatabaseError')
|
|
1178
|
+
const NetworkError = taggedError('NetworkError')
|
|
1179
|
+
|
|
1180
|
+
const [errors] = await goTryAllRaw([
|
|
1181
|
+
Promise.reject(new DatabaseError('db error')),
|
|
1182
|
+
Promise.reject(new NetworkError('network error')),
|
|
1183
|
+
Promise.reject(new Error('plain error')),
|
|
1184
|
+
], { errorClass: DatabaseError })
|
|
1185
|
+
|
|
1186
|
+
// All errors should be wrapped in DatabaseError
|
|
1187
|
+
assert.ok(errors[0] instanceof DatabaseError)
|
|
1188
|
+
assert.equal(errors[0]?._tag, 'DatabaseError')
|
|
1189
|
+
assert.ok(errors[1] instanceof DatabaseError)
|
|
1190
|
+
assert.equal(errors[1]?._tag, 'DatabaseError')
|
|
1191
|
+
assert.ok(errors[2] instanceof DatabaseError)
|
|
1192
|
+
assert.equal(errors[2]?._tag, 'DatabaseError')
|
|
1193
|
+
})
|
|
1194
|
+
|
|
1195
|
+
test('systemErrorClass only wraps non-tagged errors', async () => {
|
|
1196
|
+
const DatabaseError = taggedError('DatabaseError')
|
|
1197
|
+
const NetworkError = taggedError('NetworkError')
|
|
1198
|
+
const SystemError = taggedError('SystemError')
|
|
1199
|
+
|
|
1200
|
+
const [errors] = await goTryAllRaw([
|
|
1201
|
+
Promise.reject(new DatabaseError('db error')),
|
|
1202
|
+
Promise.reject(new NetworkError('network error')),
|
|
1203
|
+
Promise.reject(new Error('plain error')),
|
|
1204
|
+
], { systemErrorClass: SystemError })
|
|
1205
|
+
|
|
1206
|
+
// Tagged errors pass through
|
|
1207
|
+
assert.ok(errors[0] instanceof DatabaseError)
|
|
1208
|
+
assert.equal(errors[0]?._tag, 'DatabaseError')
|
|
1209
|
+
assert.ok(errors[1] instanceof NetworkError)
|
|
1210
|
+
assert.equal(errors[1]?._tag, 'NetworkError')
|
|
1211
|
+
// Non-tagged error wrapped in SystemError
|
|
1212
|
+
assert.ok(errors[2] instanceof SystemError)
|
|
1213
|
+
assert.equal(errors[2]?._tag, 'SystemError')
|
|
1214
|
+
})
|
|
1215
|
+
|
|
1216
|
+
test('concurrency option works with errorClass', async () => {
|
|
1217
|
+
const DatabaseError = taggedError('DatabaseError')
|
|
1218
|
+
|
|
1219
|
+
const [errors] = await goTryAllRaw([
|
|
1220
|
+
Promise.reject(new Error('error 1')),
|
|
1221
|
+
Promise.reject(new Error('error 2')),
|
|
1222
|
+
Promise.reject(new Error('error 3')),
|
|
1223
|
+
], { concurrency: 2, errorClass: DatabaseError })
|
|
1224
|
+
|
|
1225
|
+
assert.ok(errors[0] instanceof DatabaseError)
|
|
1226
|
+
assert.ok(errors[1] instanceof DatabaseError)
|
|
1227
|
+
assert.ok(errors[2] instanceof DatabaseError)
|
|
1228
|
+
})
|
|
1144
1229
|
})
|
|
1145
1230
|
|
|
1146
1231
|
|
package/src/index.ts
CHANGED
package/src/types.ts
CHANGED
|
@@ -47,6 +47,16 @@ export type GoTryRawOptions<E = Error> =
|
|
|
47
47
|
| { errorClass?: never; systemErrorClass: ErrorConstructor<E> }
|
|
48
48
|
| { errorClass?: never; systemErrorClass?: never }
|
|
49
49
|
|
|
50
|
+
/**
|
|
51
|
+
* Options for goTryAllRaw function.
|
|
52
|
+
* Includes concurrency control and error class options.
|
|
53
|
+
* errorClass and systemErrorClass are mutually exclusive.
|
|
54
|
+
*/
|
|
55
|
+
export type GoTryAllRawOptions<E = Error> =
|
|
56
|
+
| { concurrency?: number; errorClass: ErrorConstructor<E>; systemErrorClass?: never }
|
|
57
|
+
| { concurrency?: number; errorClass?: never; systemErrorClass: ErrorConstructor<E> }
|
|
58
|
+
| { concurrency?: number; errorClass?: never; systemErrorClass?: never }
|
|
59
|
+
|
|
50
60
|
/**
|
|
51
61
|
* Creates a union type from multiple tagged error classes.
|
|
52
62
|
*
|