runtry 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/dist/client.js +34 -24
- package/dist/error/normalize.d.ts +1 -2
- package/dist/error/normalize.d.ts.map +1 -1
- package/dist/error/normalize.js.map +1 -1
- package/dist/error/rules.d.ts +11 -3
- package/dist/error/rules.d.ts.map +1 -1
- package/dist/error/rules.js +19 -3
- package/dist/error/rules.js.map +1 -1
- package/dist/error/types.d.ts +9 -8
- package/dist/error/types.d.ts.map +1 -1
- package/dist/index.d.ts +6 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/run.d.ts +7 -4
- package/dist/runAll.d.ts +36 -27
- package/dist/runAll.js +52 -55
- package/dist/runAllOrThrow.d.ts +16 -10
- package/dist/runAllOrThrow.js +43 -45
- package/dist/runner/run.d.ts +13 -0
- package/dist/runner/run.d.ts.map +1 -0
- package/dist/runner/run.js +55 -0
- package/dist/runner/run.js.map +1 -0
- package/dist/runner/runAll.d.ts +28 -0
- package/dist/runner/runAll.d.ts.map +1 -0
- package/dist/runner/runAll.js +59 -0
- package/dist/runner/runAll.js.map +1 -0
- package/dist/runner/runAllOrThrow.d.ts +11 -0
- package/dist/runner/runAllOrThrow.d.ts.map +1 -0
- package/dist/runner/runAllOrThrow.js +48 -0
- package/dist/runner/runAllOrThrow.js.map +1 -0
- package/dist/runner/runner.d.ts +30 -0
- package/dist/runner/runner.d.ts.map +1 -0
- package/dist/runner/runner.js +33 -0
- package/dist/runner/runner.js.map +1 -0
- package/dist/runner.d.ts +39 -28
- package/dist/runner.js +41 -32
- package/dist/runner.js.map +1 -1
- package/package.json +1 -1
package/dist/client.js
CHANGED
|
@@ -1,26 +1,36 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
1
|
+
import {
|
|
2
|
+
createNormalizer,
|
|
3
|
+
defaultFallback,
|
|
4
|
+
toAppError,
|
|
5
|
+
} from "./error/normalize";
|
|
6
|
+
import { run as baseRun } from "./runner/run";
|
|
3
7
|
export function createClient(opts = {}) {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
8
|
+
const {
|
|
9
|
+
matchers = [],
|
|
10
|
+
fallback = (e) => defaultFallback(e),
|
|
11
|
+
toError: customToError,
|
|
12
|
+
ignoreAbort = true,
|
|
13
|
+
mapError: defaultMapError,
|
|
14
|
+
} = opts;
|
|
15
|
+
const toError =
|
|
16
|
+
customToError ??
|
|
17
|
+
(matchers.length > 0 ? createNormalizer(matchers, fallback) : toAppError);
|
|
18
|
+
return {
|
|
19
|
+
run(fn, options = {}) {
|
|
20
|
+
return baseRun(fn, {
|
|
21
|
+
toError,
|
|
22
|
+
ignoreAbort,
|
|
23
|
+
mapError: (err) =>
|
|
24
|
+
options.mapError
|
|
25
|
+
? options.mapError(defaultMapError ? defaultMapError(err) : err)
|
|
26
|
+
: defaultMapError
|
|
27
|
+
? defaultMapError(err)
|
|
28
|
+
: err,
|
|
29
|
+
onError: options.onError,
|
|
30
|
+
onSuccess: options.onSuccess,
|
|
31
|
+
onFinally: options.onFinally,
|
|
32
|
+
});
|
|
33
|
+
},
|
|
34
|
+
};
|
|
25
35
|
}
|
|
26
|
-
//# sourceMappingURL=client.js.map
|
|
36
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import type { AppError } from "./types";
|
|
2
|
-
export type Rule<E extends AppError = AppError> = (err: unknown) => E | null;
|
|
1
|
+
import type { AppError, Rule } from "./types";
|
|
3
2
|
export declare function createNormalizer<E extends AppError>(rules: Rule<E>[], fallback: (err: unknown) => E): (err: unknown) => E;
|
|
4
3
|
export declare function defaultFallback(err: unknown): AppError;
|
|
5
4
|
export declare function toAppError(err: unknown): AppError;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/error/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/error/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,QAAQ,EACjD,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAChB,QAAQ,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,IAErB,KAAK,OAAO,KAAG,CAAC,CAOzB;AAGD,wBAAgB,eAAe,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAQtD;AAGD,wBAAgB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,QAAQ,CAMjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/error/normalize.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"normalize.js","sourceRoot":"","sources":["../../src/error/normalize.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAC9B,KAAgB,EAChB,QAA6B;IAE7B,OAAO,CAAC,GAAY,EAAK,EAAE;QACzB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,GAAG;gBAAE,OAAO,GAAG,CAAC;QACtB,CAAC;QACD,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC;IACvB,CAAC,CAAC;AACJ,CAAC;AAED,kDAAkD;AAClD,MAAM,UAAU,eAAe,CAAC,GAAY;IAC1C,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,mEAAmE;QACnE,gEAAgE;QAChE,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QAC9D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IAC9E,CAAC;IACD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;AAC1E,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,UAAU,CAAC,GAAY;IACrC,iDAAiD;IACjD,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,YAAY,EAAE,CAAC;QAC7D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACvE,CAAC;IACD,OAAO,eAAe,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC"}
|
package/dist/error/rules.d.ts
CHANGED
|
@@ -1,10 +1,18 @@
|
|
|
1
|
-
import type { AppError } from "./types";
|
|
2
|
-
import type { Rule } from "./normalize";
|
|
1
|
+
import type { AppError, Rule } from "./types";
|
|
3
2
|
export declare const abortRule: Rule;
|
|
4
3
|
export declare const timeoutRule: Rule;
|
|
5
4
|
export declare const messageRule: Rule;
|
|
6
5
|
export declare const stringRule: Rule;
|
|
7
6
|
export declare const statusRule: Rule;
|
|
8
7
|
export declare const aggregateRule: Rule;
|
|
9
|
-
|
|
8
|
+
declare class ErrorRuleBuilder<E> {
|
|
9
|
+
private readonly matcher;
|
|
10
|
+
constructor(matcher: (err: unknown) => err is E);
|
|
11
|
+
toError<Out extends AppError>(mapper: (err: E) => Out): Rule<Out>;
|
|
12
|
+
}
|
|
13
|
+
export declare const errorRule: {
|
|
14
|
+
instance<E extends new (...args: any[]) => any>(ctor: E): ErrorRuleBuilder<InstanceType<E>>;
|
|
15
|
+
when<E = unknown>(predicate: (err: unknown) => err is E): ErrorRuleBuilder<E>;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
10
18
|
//# sourceMappingURL=rules.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/error/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,
|
|
1
|
+
{"version":3,"file":"rules.d.ts","sourceRoot":"","sources":["../../src/error/rules.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAG9C,eAAO,MAAM,SAAS,EAAE,IAKvB,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,IAazB,CAAC;AAGF,eAAO,MAAM,WAAW,EAAE,IAczB,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,IASxB,CAAC;AAGF,eAAO,MAAM,UAAU,EAAE,IAexB,CAAC;AAGF,eAAO,MAAM,aAAa,EAAE,IAU3B,CAAC;AAEF,cAAM,gBAAgB,CAAC,CAAC;IACV,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,GAAG,IAAI,CAAC;IAEhE,OAAO,CAAC,GAAG,SAAS,QAAQ,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,KAAK,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;CAMlE;AAED,eAAO,MAAM,SAAS;aACX,CAAC,SAAS,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,QAAQ,CAAC;SAMlD,CAAC,uBAAuB,CAAC,GAAG,EAAE,OAAO,KAAK,GAAG,IAAI,CAAC;CAGxD,CAAC"}
|
package/dist/error/rules.js
CHANGED
|
@@ -73,8 +73,24 @@ export const aggregateRule = (err) => {
|
|
|
73
73
|
}
|
|
74
74
|
return null;
|
|
75
75
|
};
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
76
|
+
class ErrorRuleBuilder {
|
|
77
|
+
constructor(matcher) {
|
|
78
|
+
this.matcher = matcher;
|
|
79
|
+
}
|
|
80
|
+
toError(mapper) {
|
|
81
|
+
return (err) => {
|
|
82
|
+
if (!this.matcher(err))
|
|
83
|
+
return null;
|
|
84
|
+
return mapper(err);
|
|
85
|
+
};
|
|
86
|
+
}
|
|
79
87
|
}
|
|
88
|
+
export const errorRule = {
|
|
89
|
+
instance(ctor) {
|
|
90
|
+
return new ErrorRuleBuilder((err) => err instanceof ctor);
|
|
91
|
+
},
|
|
92
|
+
when(predicate) {
|
|
93
|
+
return new ErrorRuleBuilder(predicate);
|
|
94
|
+
},
|
|
95
|
+
};
|
|
80
96
|
//# sourceMappingURL=rules.js.map
|
package/dist/error/rules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/error/rules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/error/rules.ts"],"names":[],"mappings":"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"}
|
package/dist/error/types.d.ts
CHANGED
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
export type AppErrorCode = "ABORTED" | "NETWORK" | "TIMEOUT" | "VALIDATION" | "HTTP" | "UNKNOWN";
|
|
2
|
+
export type Rule<E extends AppError = AppError> = (err: unknown) => E | null;
|
|
2
3
|
/**
|
|
3
|
-
* A normalized error shape returned by `run()`.
|
|
4
|
-
*
|
|
5
|
-
* - `code`: A stable identifier you can switch on (e.g. "HTTP", "VALIDATION").
|
|
6
|
-
* - `message`: User-facing or log-friendly message.
|
|
7
|
-
* - `status`: Optional numeric status (commonly HTTP status).
|
|
8
|
-
* - `meta`: Optional payload with extra context (response body, validation fields, etc.).
|
|
9
|
-
* - `cause`: The original thrown value for debugging.
|
|
10
|
-
*/
|
|
4
|
+
* A normalized error shape returned by `run()`.
|
|
5
|
+
*
|
|
6
|
+
* - `code`: A stable identifier you can switch on (e.g. "HTTP", "VALIDATION").
|
|
7
|
+
* - `message`: User-facing or log-friendly message.
|
|
8
|
+
* - `status`: Optional numeric status (commonly HTTP status).
|
|
9
|
+
* - `meta`: Optional payload with extra context (response body, validation fields, etc.).
|
|
10
|
+
* - `cause`: The original thrown value for debugging.
|
|
11
|
+
*/
|
|
11
12
|
export type AppError<Meta = unknown> = {
|
|
12
13
|
code: AppErrorCode | (string & {});
|
|
13
14
|
message: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/error/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,SAAS,GACT,SAAS,GACT,YAAY,GACZ,MAAM,GACN,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/error/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,YAAY,GACpB,SAAS,GACT,SAAS,GACT,SAAS,GACT,YAAY,GACZ,MAAM,GACN,SAAS,CAAC;AAEd,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC;AAE7E;;;;;;;;GAQG;AACH,MAAM,MAAM,QAAQ,CAAC,IAAI,GAAG,OAAO,IAAI;IACrC,IAAI,EAAE,YAAY,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;IACnC,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
export { run } from "./run";
|
|
2
|
-
export { runAll } from "./runAll";
|
|
3
|
-
export type { RunAllOptions } from "./runAll";
|
|
1
|
+
export { run } from "./runner/run";
|
|
2
|
+
export { runAll } from "./runner/runAll";
|
|
3
|
+
export type { RunAllOptions } from "./runner/runAll";
|
|
4
4
|
export type { RunOptions, RunResult, RetryOptions } from "./types";
|
|
5
5
|
export type { AppError, AppErrorCode } from "./error/types";
|
|
6
6
|
export { toAppError, defaultFallback, createNormalizer, } from "./error/normalize";
|
|
7
|
-
export { abortRule, timeoutRule,
|
|
8
|
-
export { createRunner } from "./runner";
|
|
9
|
-
export type { CreateRunnerOptions } from "./runner";
|
|
7
|
+
export { abortRule, timeoutRule, errorRule, messageRule, stringRule, statusRule, aggregateRule, } from "./error/rules";
|
|
8
|
+
export { createRunner } from "./runner/runner";
|
|
9
|
+
export type { CreateRunnerOptions } from "./runner/runner";
|
|
10
10
|
//# 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,OAAO,EAAE,GAAG,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,YAAY,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AACrD,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAEnE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,YAAY,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
export { run } from "./run";
|
|
2
|
-
export { runAll } from "./runAll";
|
|
1
|
+
export { run } from "./runner/run";
|
|
2
|
+
export { runAll } from "./runner/runAll";
|
|
3
3
|
export { toAppError, defaultFallback, createNormalizer, } from "./error/normalize";
|
|
4
|
-
export { abortRule, timeoutRule,
|
|
5
|
-
export { createRunner } from "./runner";
|
|
4
|
+
export { abortRule, timeoutRule, errorRule, messageRule, stringRule, statusRule, aggregateRule, } from "./error/rules";
|
|
5
|
+
export { createRunner } from "./runner/runner";
|
|
6
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,cAAc,CAAC;AACnC,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AAKzC,OAAO,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,SAAS,EACT,WAAW,EACX,SAAS,EACT,WAAW,EACX,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
package/dist/run.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import type { AppError } from "
|
|
2
|
-
import type { RunOptions, RunResult } from "
|
|
1
|
+
import type { AppError } from "../error/types";
|
|
2
|
+
import type { RunOptions, RunResult } from "../types";
|
|
3
3
|
/**
|
|
4
4
|
* Executes an async operation and returns a Result instead of throwing.
|
|
5
5
|
*
|
|
@@ -9,5 +9,8 @@ import type { RunOptions, RunResult } from "./types";
|
|
|
9
9
|
* This utility is framework-agnostic and works in browsers, Node.js,
|
|
10
10
|
* React effects, and any async context.
|
|
11
11
|
*/
|
|
12
|
-
export declare function run<T, E extends AppError = AppError>(
|
|
13
|
-
|
|
12
|
+
export declare function run<T, E extends AppError = AppError>(
|
|
13
|
+
fn: () => Promise<T>,
|
|
14
|
+
options?: RunOptions<T, E>
|
|
15
|
+
): Promise<RunResult<T, E>>;
|
|
16
|
+
//# sourceMappingURL=run.d.ts.map
|
package/dist/runAll.d.ts
CHANGED
|
@@ -1,28 +1,37 @@
|
|
|
1
|
-
import type { AppError } from "
|
|
2
|
-
import type { RunOptions, RunResult } from "
|
|
3
|
-
export type RunAllItemResult<T, E extends AppError = AppError> =
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
1
|
+
import type { AppError } from "../error/types";
|
|
2
|
+
import type { RunOptions, RunResult } from "../types";
|
|
3
|
+
export type RunAllItemResult<T, E extends AppError = AppError> =
|
|
4
|
+
| ({
|
|
5
|
+
status: "ok";
|
|
6
|
+
} & RunResult<T, E>)
|
|
7
|
+
| ({
|
|
8
|
+
status: "error";
|
|
9
|
+
} & RunResult<T, E>)
|
|
10
|
+
| {
|
|
11
|
+
status: "skipped";
|
|
12
|
+
ok: false;
|
|
13
|
+
data: null;
|
|
14
|
+
error: null;
|
|
15
|
+
};
|
|
16
|
+
export type RunAllOptions<T, E extends AppError = AppError> = RunOptions<
|
|
17
|
+
T,
|
|
18
|
+
E
|
|
19
|
+
> & {
|
|
20
|
+
/**
|
|
21
|
+
* Maximum number of concurrent tasks to run.
|
|
22
|
+
* @default Infinity
|
|
23
|
+
*/
|
|
24
|
+
concurrency?: number;
|
|
25
|
+
/**
|
|
26
|
+
* Execution mode regarding errors.
|
|
27
|
+
* - "settle": Run all tasks (default).
|
|
28
|
+
* - "fail-fast": Stop starting new tasks if one fails.
|
|
29
|
+
* @default "settle"
|
|
30
|
+
*/
|
|
31
|
+
mode?: "settle" | "fail-fast";
|
|
12
32
|
};
|
|
13
|
-
export
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
concurrency?: number;
|
|
19
|
-
/**
|
|
20
|
-
* Execution mode regarding errors.
|
|
21
|
-
* - "settle": Run all tasks (default).
|
|
22
|
-
* - "fail-fast": Stop starting new tasks if one fails.
|
|
23
|
-
* @default "settle"
|
|
24
|
-
*/
|
|
25
|
-
mode?: "settle" | "fail-fast";
|
|
26
|
-
};
|
|
27
|
-
export declare function runAll<T, E extends AppError = AppError>(tasks: Array<() => Promise<T>>, options?: RunAllOptions<T, E>): Promise<RunAllItemResult<T, E>[]>;
|
|
28
|
-
//# sourceMappingURL=runAll.d.ts.map
|
|
33
|
+
export declare function runAll<T, E extends AppError = AppError>(
|
|
34
|
+
tasks: Array<() => Promise<T>>,
|
|
35
|
+
options?: RunAllOptions<T, E>
|
|
36
|
+
): Promise<RunAllItemResult<T, E>[]>;
|
|
37
|
+
//# sourceMappingURL=runAll.d.ts.map
|
package/dist/runAll.js
CHANGED
|
@@ -1,59 +1,56 @@
|
|
|
1
|
-
import { run } from "./run";
|
|
1
|
+
import { run } from "./runner/run";
|
|
2
2
|
export async function runAll(tasks, options = {}) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
error: null,
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
};
|
|
27
|
-
// Run all in parallel if unlimited or limit >= count
|
|
28
|
-
if (limit >= tasks.length) {
|
|
29
|
-
const rs = await Promise.all(tasks.map((t) => run(t, runOptions)));
|
|
30
|
-
rs.forEach((r, i) => {
|
|
31
|
-
setResult(i, r);
|
|
32
|
-
});
|
|
33
|
-
return results;
|
|
3
|
+
const { concurrency = Infinity, mode = "settle", ...runOptions } = options;
|
|
4
|
+
if (tasks.length === 0) return [];
|
|
5
|
+
const limit = Number.isFinite(concurrency)
|
|
6
|
+
? Math.max(1, Math.floor(concurrency))
|
|
7
|
+
: Infinity;
|
|
8
|
+
const results = new Array(tasks.length);
|
|
9
|
+
let nextIndex = 0;
|
|
10
|
+
let aborted = false;
|
|
11
|
+
const setResult = (i, r) => {
|
|
12
|
+
results[i] = r.ok ? { ...r, status: "ok" } : { ...r, status: "error" };
|
|
13
|
+
};
|
|
14
|
+
const markSkipped = () => {
|
|
15
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
16
|
+
if (results[i]) continue;
|
|
17
|
+
results[i] = {
|
|
18
|
+
status: "skipped",
|
|
19
|
+
ok: false,
|
|
20
|
+
data: null,
|
|
21
|
+
error: null,
|
|
22
|
+
};
|
|
34
23
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
const task = tasks[i];
|
|
43
|
-
if (!task)
|
|
44
|
-
continue; // skip if task is undefined
|
|
45
|
-
const r = await run(task, runOptions);
|
|
46
|
-
setResult(i, r);
|
|
47
|
-
if (!r.ok) {
|
|
48
|
-
if (mode === "fail-fast") {
|
|
49
|
-
aborted = true;
|
|
50
|
-
return;
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
};
|
|
55
|
-
await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, () => worker()));
|
|
56
|
-
markSkipped();
|
|
24
|
+
};
|
|
25
|
+
// Run all in parallel if unlimited or limit >= count
|
|
26
|
+
if (limit >= tasks.length) {
|
|
27
|
+
const rs = await Promise.all(tasks.map((t) => run(t, runOptions)));
|
|
28
|
+
rs.forEach((r, i) => {
|
|
29
|
+
setResult(i, r);
|
|
30
|
+
});
|
|
57
31
|
return results;
|
|
32
|
+
}
|
|
33
|
+
const worker = async () => {
|
|
34
|
+
while (true) {
|
|
35
|
+
if (aborted) return;
|
|
36
|
+
const i = nextIndex++;
|
|
37
|
+
if (i >= tasks.length) return;
|
|
38
|
+
const task = tasks[i];
|
|
39
|
+
if (!task) continue; // skip if task is undefined
|
|
40
|
+
const r = await run(task, runOptions);
|
|
41
|
+
setResult(i, r);
|
|
42
|
+
if (!r.ok) {
|
|
43
|
+
if (mode === "fail-fast") {
|
|
44
|
+
aborted = true;
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
await Promise.all(
|
|
51
|
+
Array.from({ length: Math.min(limit, tasks.length) }, () => worker())
|
|
52
|
+
);
|
|
53
|
+
markSkipped();
|
|
54
|
+
return results;
|
|
58
55
|
}
|
|
59
|
-
//# sourceMappingURL=runAll.js.map
|
|
56
|
+
//# sourceMappingURL=runAll.js.map
|
package/dist/runAllOrThrow.d.ts
CHANGED
|
@@ -1,11 +1,17 @@
|
|
|
1
|
-
import type { AppError } from "
|
|
2
|
-
import type { RunOptions } from "
|
|
3
|
-
export type RunAllOrThrowOptions<T, E extends AppError = AppError> = RunOptions<
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
1
|
+
import type { AppError } from "../error/types";
|
|
2
|
+
import type { RunOptions } from "../types";
|
|
3
|
+
export type RunAllOrThrowOptions<T, E extends AppError = AppError> = RunOptions<
|
|
4
|
+
T,
|
|
5
|
+
E
|
|
6
|
+
> & {
|
|
7
|
+
/**
|
|
8
|
+
* Maximum number of concurrent tasks to run.
|
|
9
|
+
* @default Infinity
|
|
10
|
+
*/
|
|
11
|
+
concurrency?: number;
|
|
9
12
|
};
|
|
10
|
-
export declare function runAllOrThrow<T, E extends AppError = AppError>(
|
|
11
|
-
|
|
13
|
+
export declare function runAllOrThrow<T, E extends AppError = AppError>(
|
|
14
|
+
tasks: Array<() => Promise<T>>,
|
|
15
|
+
options?: RunAllOrThrowOptions<T, E>
|
|
16
|
+
): Promise<T[]>;
|
|
17
|
+
//# sourceMappingURL=runAllOrThrow.d.ts.map
|
package/dist/runAllOrThrow.js
CHANGED
|
@@ -1,48 +1,46 @@
|
|
|
1
|
-
import { run } from "./run";
|
|
1
|
+
import { run } from "./runner/run";
|
|
2
2
|
export async function runAllOrThrow(tasks, options = {}) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
return data;
|
|
19
|
-
}
|
|
20
|
-
let nextIndex = 0;
|
|
21
|
-
let aborted = false;
|
|
22
|
-
let firstError = null;
|
|
23
|
-
const worker = async () => {
|
|
24
|
-
while (true) {
|
|
25
|
-
if (aborted)
|
|
26
|
-
return;
|
|
27
|
-
const i = nextIndex++;
|
|
28
|
-
if (i >= tasks.length)
|
|
29
|
-
return;
|
|
30
|
-
const task = tasks[i];
|
|
31
|
-
if (!task)
|
|
32
|
-
continue; // skip if task is undefined
|
|
33
|
-
const r = await run(task, runOptions);
|
|
34
|
-
if (!r.ok) {
|
|
35
|
-
firstError ?? (firstError = r.error);
|
|
36
|
-
aborted = true;
|
|
37
|
-
return;
|
|
38
|
-
}
|
|
39
|
-
data[i] = r.data;
|
|
40
|
-
}
|
|
41
|
-
};
|
|
42
|
-
await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, () => worker()));
|
|
43
|
-
if (firstError)
|
|
44
|
-
throw firstError;
|
|
45
|
-
// Safety fill
|
|
3
|
+
const { concurrency = Infinity, ...runOptions } = options;
|
|
4
|
+
if (tasks.length === 0) return [];
|
|
5
|
+
const limit = Number.isFinite(concurrency)
|
|
6
|
+
? Math.max(1, Math.floor(concurrency))
|
|
7
|
+
: Infinity;
|
|
8
|
+
const data = new Array(tasks.length);
|
|
9
|
+
// Run all in parallel if unlimited or limit >= count
|
|
10
|
+
if (limit >= tasks.length) {
|
|
11
|
+
await Promise.all(
|
|
12
|
+
tasks.map(async (t, i) => {
|
|
13
|
+
const r = await run(t, runOptions);
|
|
14
|
+
if (!r.ok) throw r.error;
|
|
15
|
+
data[i] = r.data;
|
|
16
|
+
})
|
|
17
|
+
);
|
|
46
18
|
return data;
|
|
19
|
+
}
|
|
20
|
+
let nextIndex = 0;
|
|
21
|
+
let aborted = false;
|
|
22
|
+
let firstError = null;
|
|
23
|
+
const worker = async () => {
|
|
24
|
+
while (true) {
|
|
25
|
+
if (aborted) return;
|
|
26
|
+
const i = nextIndex++;
|
|
27
|
+
if (i >= tasks.length) return;
|
|
28
|
+
const task = tasks[i];
|
|
29
|
+
if (!task) continue; // skip if task is undefined
|
|
30
|
+
const r = await run(task, runOptions);
|
|
31
|
+
if (!r.ok) {
|
|
32
|
+
firstError ?? (firstError = r.error);
|
|
33
|
+
aborted = true;
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
data[i] = r.data;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
await Promise.all(
|
|
40
|
+
Array.from({ length: Math.min(limit, tasks.length) }, () => worker())
|
|
41
|
+
);
|
|
42
|
+
if (firstError) throw firstError;
|
|
43
|
+
// Safety fill
|
|
44
|
+
return data;
|
|
47
45
|
}
|
|
48
|
-
//# sourceMappingURL=runAllOrThrow.js.map
|
|
46
|
+
//# sourceMappingURL=runAllOrThrow.js.map
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { AppError } from "../error/types";
|
|
2
|
+
import type { RunOptions, RunResult } from "../types";
|
|
3
|
+
/**
|
|
4
|
+
* Executes an async operation and returns a Result instead of throwing.
|
|
5
|
+
*
|
|
6
|
+
* Errors are normalized into an `AppError` (or a custom error type `E`)
|
|
7
|
+
* using the provided `toError` function.
|
|
8
|
+
*
|
|
9
|
+
* This utility is framework-agnostic and works in browsers, Node.js,
|
|
10
|
+
* React effects, and any async context.
|
|
11
|
+
*/
|
|
12
|
+
export declare function run<T, E extends AppError = AppError>(fn: () => Promise<T>, options?: RunOptions<T, E>): Promise<RunResult<T, E>>;
|
|
13
|
+
//# sourceMappingURL=run.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/runner/run.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAGtD;;;;;;;;GAQG;AACH,wBAAsB,GAAG,CAAC,CAAC,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,EACxD,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,GAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAM,GAC7B,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAmE1B"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { toAppError as defaultToAppError } from "../error/normalize";
|
|
2
|
+
import { applyJitter, resolveRetryDelay, sleep } from "../utils";
|
|
3
|
+
/**
|
|
4
|
+
* Executes an async operation and returns a Result instead of throwing.
|
|
5
|
+
*
|
|
6
|
+
* Errors are normalized into an `AppError` (or a custom error type `E`)
|
|
7
|
+
* using the provided `toError` function.
|
|
8
|
+
*
|
|
9
|
+
* This utility is framework-agnostic and works in browsers, Node.js,
|
|
10
|
+
* React effects, and any async context.
|
|
11
|
+
*/
|
|
12
|
+
export async function run(fn, options = {}) {
|
|
13
|
+
const { toError = defaultToAppError, mapError, onError, onSuccess, onFinally, ignoreAbort = true, retries = 0, retryDelay, shouldRetry = () => true, jitter = { ratio: 0.5, mode: "full" }, } = options;
|
|
14
|
+
const defaultBaseDelay = retries > 0 ? 300 : 0;
|
|
15
|
+
let attempt = 0;
|
|
16
|
+
while (true) {
|
|
17
|
+
try {
|
|
18
|
+
const data = await fn();
|
|
19
|
+
onSuccess?.(data);
|
|
20
|
+
onFinally?.();
|
|
21
|
+
return { ok: true, data, error: null };
|
|
22
|
+
}
|
|
23
|
+
catch (e) {
|
|
24
|
+
let err = toError(e);
|
|
25
|
+
if (mapError)
|
|
26
|
+
err = mapError(err);
|
|
27
|
+
const isAborted = err.code === "ABORTED";
|
|
28
|
+
if (isAborted) {
|
|
29
|
+
if (!ignoreAbort) {
|
|
30
|
+
onError?.(err);
|
|
31
|
+
}
|
|
32
|
+
onFinally?.();
|
|
33
|
+
return { ok: false, data: null, error: err };
|
|
34
|
+
// If not ignoring abort, we fall through to onError and return
|
|
35
|
+
}
|
|
36
|
+
const nextAttempt = attempt + 1;
|
|
37
|
+
const canRetry = attempt < retries && shouldRetry(nextAttempt, err);
|
|
38
|
+
if (canRetry) {
|
|
39
|
+
attempt = nextAttempt;
|
|
40
|
+
let delay = resolveRetryDelay(retryDelay, attempt, err, defaultBaseDelay);
|
|
41
|
+
if (!Number.isFinite(delay) || delay < 0)
|
|
42
|
+
delay = 0;
|
|
43
|
+
delay = applyJitter(delay, jitter);
|
|
44
|
+
if (delay > 0)
|
|
45
|
+
await sleep(delay);
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
// Final failure or aborted
|
|
49
|
+
onError?.(err);
|
|
50
|
+
onFinally?.();
|
|
51
|
+
return { ok: false, data: null, error: err };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"run.js","sourceRoot":"","sources":["../../src/runner/run.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,IAAI,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEjE;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,GAAG,CACvB,EAAoB,EACpB,UAA4B,EAAE;IAE9B,MAAM,EACJ,OAAO,GAAG,iBAAmD,EAC7D,QAAQ,EACR,OAAO,EACP,SAAS,EACT,SAAS,EACT,WAAW,GAAG,IAAI,EAClB,OAAO,GAAG,CAAC,EACX,UAAU,EACV,WAAW,GAAG,GAAG,EAAE,CAAC,IAAI,EACxB,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GACtC,GAAG,OAAO,CAAC;IAEZ,MAAM,gBAAgB,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAE/C,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,EAAE,EAAE,CAAC;YACxB,SAAS,EAAE,CAAC,IAAI,CAAC,CAAC;YAClB,SAAS,EAAE,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;QACzC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACrB,IAAI,QAAQ;gBAAE,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;YAElC,MAAM,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,SAAS,CAAC;YAEzC,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,CAAC,WAAW,EAAE,CAAC;oBACjB,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;gBACjB,CAAC;gBAED,SAAS,EAAE,EAAE,CAAC;gBACd,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;gBAC7C,+DAA+D;YACjE,CAAC;YAED,MAAM,WAAW,GAAG,OAAO,GAAG,CAAC,CAAC;YAChC,MAAM,QAAQ,GAAG,OAAO,GAAG,OAAO,IAAI,WAAW,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;YAEpE,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,GAAG,WAAW,CAAC;gBAEtB,IAAI,KAAK,GAAG,iBAAiB,CAC3B,UAAU,EACV,OAAO,EACP,GAAG,EACH,gBAAgB,CACjB,CAAC;gBAEF,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC;oBAAE,KAAK,GAAG,CAAC,CAAC;gBAEpD,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;gBAEnC,IAAI,KAAK,GAAG,CAAC;oBAAE,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;gBAClC,SAAS;YACX,CAAC;YAED,2BAA2B;YAC3B,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;YACf,SAAS,EAAE,EAAE,CAAC;YACd,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;QAC/C,CAAC;IACH,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { AppError } from "../error/types";
|
|
2
|
+
import type { RunOptions, RunResult } from "../types";
|
|
3
|
+
export type RunAllItemResult<T, E extends AppError = AppError> = ({
|
|
4
|
+
status: "ok";
|
|
5
|
+
} & RunResult<T, E>) | ({
|
|
6
|
+
status: "error";
|
|
7
|
+
} & RunResult<T, E>) | {
|
|
8
|
+
status: "skipped";
|
|
9
|
+
ok: false;
|
|
10
|
+
data: null;
|
|
11
|
+
error: null;
|
|
12
|
+
};
|
|
13
|
+
export type RunAllOptions<T, E extends AppError = AppError> = RunOptions<T, E> & {
|
|
14
|
+
/**
|
|
15
|
+
* Maximum number of concurrent tasks to run.
|
|
16
|
+
* @default Infinity
|
|
17
|
+
*/
|
|
18
|
+
concurrency?: number;
|
|
19
|
+
/**
|
|
20
|
+
* Execution mode regarding errors.
|
|
21
|
+
* - "settle": Run all tasks (default).
|
|
22
|
+
* - "fail-fast": Stop starting new tasks if one fails.
|
|
23
|
+
* @default "settle"
|
|
24
|
+
*/
|
|
25
|
+
mode?: "settle" | "fail-fast";
|
|
26
|
+
};
|
|
27
|
+
export declare function runAll<T, E extends AppError = AppError>(tasks: Array<() => Promise<T>>, options?: RunAllOptions<T, E>): Promise<RunAllItemResult<T, E>[]>;
|
|
28
|
+
//# sourceMappingURL=runAll.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runAll.d.ts","sourceRoot":"","sources":["../../src/runner/runAll.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtD,MAAM,MAAM,gBAAgB,CAAC,CAAC,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,IACzD,CAAC;IAAE,MAAM,EAAE,IAAI,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACpC,CAAC;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACvC;IACE,MAAM,EAAE,SAAS,CAAC;IAClB,EAAE,EAAE,KAAK,CAAC;IACV,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,IAAI,CAAC;CACb,CAAC;AAEN,MAAM,MAAM,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI,UAAU,CACtE,CAAC,EACD,CAAC,CACF,GAAG;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IAErB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,QAAQ,GAAG,WAAW,CAAC;CAC/B,CAAC;AAEF,wBAAsB,MAAM,CAAC,CAAC,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAC3D,KAAK,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAC9B,OAAO,GAAE,aAAa,CAAC,CAAC,EAAE,CAAC,CAAM,GAChC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAmEnC"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { run } from "./run";
|
|
2
|
+
export async function runAll(tasks, options = {}) {
|
|
3
|
+
const { concurrency = Infinity, mode = "settle", ...runOptions } = options;
|
|
4
|
+
if (tasks.length === 0)
|
|
5
|
+
return [];
|
|
6
|
+
const limit = Number.isFinite(concurrency)
|
|
7
|
+
? Math.max(1, Math.floor(concurrency))
|
|
8
|
+
: Infinity;
|
|
9
|
+
const results = new Array(tasks.length);
|
|
10
|
+
let nextIndex = 0;
|
|
11
|
+
let aborted = false;
|
|
12
|
+
const setResult = (i, r) => {
|
|
13
|
+
results[i] = r.ok ? { ...r, status: "ok" } : { ...r, status: "error" };
|
|
14
|
+
};
|
|
15
|
+
const markSkipped = () => {
|
|
16
|
+
for (let i = 0; i < tasks.length; i++) {
|
|
17
|
+
if (results[i])
|
|
18
|
+
continue;
|
|
19
|
+
results[i] = {
|
|
20
|
+
status: "skipped",
|
|
21
|
+
ok: false,
|
|
22
|
+
data: null,
|
|
23
|
+
error: null,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
// Run all in parallel if unlimited or limit >= count
|
|
28
|
+
if (limit >= tasks.length) {
|
|
29
|
+
const rs = await Promise.all(tasks.map((t) => run(t, runOptions)));
|
|
30
|
+
rs.forEach((r, i) => {
|
|
31
|
+
setResult(i, r);
|
|
32
|
+
});
|
|
33
|
+
return results;
|
|
34
|
+
}
|
|
35
|
+
const worker = async () => {
|
|
36
|
+
while (true) {
|
|
37
|
+
if (aborted)
|
|
38
|
+
return;
|
|
39
|
+
const i = nextIndex++;
|
|
40
|
+
if (i >= tasks.length)
|
|
41
|
+
return;
|
|
42
|
+
const task = tasks[i];
|
|
43
|
+
if (!task)
|
|
44
|
+
continue; // skip if task is undefined
|
|
45
|
+
const r = await run(task, runOptions);
|
|
46
|
+
setResult(i, r);
|
|
47
|
+
if (!r.ok) {
|
|
48
|
+
if (mode === "fail-fast") {
|
|
49
|
+
aborted = true;
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, () => worker()));
|
|
56
|
+
markSkipped();
|
|
57
|
+
return results;
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=runAll.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runAll.js","sourceRoot":"","sources":["../../src/runner/runAll.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { AppError } from "../error/types";
|
|
2
|
+
import type { RunOptions } from "../types";
|
|
3
|
+
export type RunAllOrThrowOptions<T, E extends AppError = AppError> = RunOptions<T, E> & {
|
|
4
|
+
/**
|
|
5
|
+
* Maximum number of concurrent tasks to run.
|
|
6
|
+
* @default Infinity
|
|
7
|
+
*/
|
|
8
|
+
concurrency?: number;
|
|
9
|
+
};
|
|
10
|
+
export declare function runAllOrThrow<T, E extends AppError = AppError>(tasks: Array<() => Promise<T>>, options?: RunAllOrThrowOptions<T, E>): Promise<T[]>;
|
|
11
|
+
//# sourceMappingURL=runAllOrThrow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runAllOrThrow.d.ts","sourceRoot":"","sources":["../../src/runner/runAllOrThrow.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAa,MAAM,UAAU,CAAC;AAEtD,MAAM,MAAM,oBAAoB,CAAC,CAAC,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI,UAAU,CAC7E,CAAC,EACD,CAAC,CACF,GAAG;IACF;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAEF,wBAAsB,aAAa,CAAC,CAAC,EAAE,CAAC,SAAS,QAAQ,GAAG,QAAQ,EAClE,KAAK,EAAE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAC9B,OAAO,GAAE,oBAAoB,CAAC,CAAC,EAAE,CAAC,CAAM,GACvC,OAAO,CAAC,CAAC,EAAE,CAAC,CAyDd"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { run } from "./run";
|
|
2
|
+
export async function runAllOrThrow(tasks, options = {}) {
|
|
3
|
+
const { concurrency = Infinity, ...runOptions } = options;
|
|
4
|
+
if (tasks.length === 0)
|
|
5
|
+
return [];
|
|
6
|
+
const limit = Number.isFinite(concurrency)
|
|
7
|
+
? Math.max(1, Math.floor(concurrency))
|
|
8
|
+
: Infinity;
|
|
9
|
+
const data = new Array(tasks.length);
|
|
10
|
+
// Run all in parallel if unlimited or limit >= count
|
|
11
|
+
if (limit >= tasks.length) {
|
|
12
|
+
await Promise.all(tasks.map(async (t, i) => {
|
|
13
|
+
const r = await run(t, runOptions);
|
|
14
|
+
if (!r.ok)
|
|
15
|
+
throw r.error;
|
|
16
|
+
data[i] = r.data;
|
|
17
|
+
}));
|
|
18
|
+
return data;
|
|
19
|
+
}
|
|
20
|
+
let nextIndex = 0;
|
|
21
|
+
let aborted = false;
|
|
22
|
+
let firstError = null;
|
|
23
|
+
const worker = async () => {
|
|
24
|
+
while (true) {
|
|
25
|
+
if (aborted)
|
|
26
|
+
return;
|
|
27
|
+
const i = nextIndex++;
|
|
28
|
+
if (i >= tasks.length)
|
|
29
|
+
return;
|
|
30
|
+
const task = tasks[i];
|
|
31
|
+
if (!task)
|
|
32
|
+
continue; // skip if task is undefined
|
|
33
|
+
const r = await run(task, runOptions);
|
|
34
|
+
if (!r.ok) {
|
|
35
|
+
firstError ?? (firstError = r.error);
|
|
36
|
+
aborted = true;
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
data[i] = r.data;
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
await Promise.all(Array.from({ length: Math.min(limit, tasks.length) }, () => worker()));
|
|
43
|
+
if (firstError)
|
|
44
|
+
throw firstError;
|
|
45
|
+
// Safety fill
|
|
46
|
+
return data;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=runAllOrThrow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runAllOrThrow.js","sourceRoot":"","sources":["../../src/runner/runAllOrThrow.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAe5B,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAA8B,EAC9B,UAAsC,EAAE;IAExC,MAAM,EAAE,WAAW,GAAG,QAAQ,EAAE,GAAG,UAAU,EAAE,GAAG,OAAO,CAAC;IAE1D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QACxC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QACtC,CAAC,CAAC,QAAQ,CAAC;IAEb,MAAM,IAAI,GAAQ,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAE1C,qDAAqD;IACrD,IAAI,KAAK,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YACvB,MAAM,CAAC,GAAG,MAAM,GAAG,CAAO,CAAC,EAAE,UAAU,CAAC,CAAC;YACzC,IAAI,CAAC,CAAC,CAAC,EAAE;gBAAE,MAAM,CAAC,CAAC,KAAK,CAAC;YACzB,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,CAAC,CAAC,CACH,CAAC;QACF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,UAAU,GAAa,IAAI,CAAC;IAEhC,MAAM,MAAM,GAAG,KAAK,IAAI,EAAE;QACxB,OAAO,IAAI,EAAE,CAAC;YACZ,IAAI,OAAO;gBAAE,OAAO;YAEpB,MAAM,CAAC,GAAG,SAAS,EAAE,CAAC;YACtB,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,OAAO;YAE9B,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI;gBAAE,SAAS,CAAC,4BAA4B;YAEjD,MAAM,CAAC,GAAG,MAAM,GAAG,CAAO,IAAI,EAAE,UAAU,CAAC,CAAC;YAE5C,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACV,UAAU,KAAV,UAAU,GAAK,CAAC,CAAC,KAAK,EAAC;gBACvB,OAAO,GAAG,IAAI,CAAC;gBACf,OAAO;YACT,CAAC;YAED,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;QACnB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,CAAC,GAAG,CACf,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC,CACtE,CAAC;IAEF,IAAI,UAAU;QAAE,MAAM,UAAU,CAAC;IAEjC,cAAc;IACd,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { AppError, Rule } from "../error/types";
|
|
2
|
+
import type { RunOptions, RunResult } from "../types";
|
|
3
|
+
import { type RunAllItemResult, type RunAllOptions } from "./runAll";
|
|
4
|
+
export type CreateRunnerOptions<E extends AppError = AppError> = {
|
|
5
|
+
/**
|
|
6
|
+
* Custom matchers to use for normalizing errors.
|
|
7
|
+
* If not provided, the default matchers are used.
|
|
8
|
+
*/
|
|
9
|
+
rules?: Rule<E>[];
|
|
10
|
+
/**
|
|
11
|
+
* Custom fallback function to use for normalizing errors.
|
|
12
|
+
* If not provided, the default fallback is used.
|
|
13
|
+
*/
|
|
14
|
+
fallback?: (err: unknown) => E;
|
|
15
|
+
/**
|
|
16
|
+
* If you want a completely custom normalizer, you can provide it directly.
|
|
17
|
+
* If set, `matchers` and `fallback` are ignored.
|
|
18
|
+
*/
|
|
19
|
+
toError?: (err: unknown) => E;
|
|
20
|
+
/** Default for run options */
|
|
21
|
+
ignoreAbort?: boolean;
|
|
22
|
+
/** Optional default mapper for all runs */
|
|
23
|
+
mapError?: (error: E) => E;
|
|
24
|
+
};
|
|
25
|
+
export declare function createRunner<E extends AppError = AppError>(opts?: CreateRunnerOptions<E>): {
|
|
26
|
+
run<T>(fn: () => Promise<T>, options?: RunOptions<T, E>): Promise<RunResult<T, E>>;
|
|
27
|
+
all<T>(fns: Array<() => Promise<T>>, options?: RunAllOptions<T, E>): Promise<RunAllItemResult<T, E>[]>;
|
|
28
|
+
allOrThrow<T>(fns: (() => Promise<T>)[], options?: RunOptions<T, E>): Promise<T[]>;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AAOrD,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EAEL,KAAK,gBAAgB,EACrB,KAAK,aAAa,EACnB,MAAM,UAAU,CAAC;AAElB,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI;IAC/D;;;OAGG;IACH,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAElB;;;OAGG;IACH,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC;IAE/B;;;OAGG;IACH,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,CAAC;IAE9B,8BAA8B;IAC9B,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC;CAC5B,CAAC;AAOF,wBAAgB,YAAY,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,EACxD,IAAI,GAAE,mBAAmB,CAAC,CAAC,CAAM;QAiB3B,CAAC,MACC,MAAM,OAAO,CAAC,CAAC,CAAC,YACX,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GACxB,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAMvB,CAAC,OACE,KAAK,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,YACnB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,GAC3B,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;eAMzB,CAAC,OACL,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,YAChB,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,GACxB,OAAO,CAAC,CAAC,EAAE,CAAC;EAOlB"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { createNormalizer, defaultFallback, toAppError, } from "../error/normalize";
|
|
2
|
+
import { run as baseRun } from "./run";
|
|
3
|
+
import { runAllOrThrow as baseRunAllOrThrow } from "./runAllOrThrow";
|
|
4
|
+
import { runAll as baseRunAll, } from "./runAll";
|
|
5
|
+
const composeMapError = (base, local) => (e) => local ? local(base ? base(e) : e) : base ? base(e) : e;
|
|
6
|
+
export function createRunner(opts = {}) {
|
|
7
|
+
const { rules = [], fallback = (e) => defaultFallback(e), toError: customToError, ignoreAbort = true, mapError: defaultMapError, } = opts;
|
|
8
|
+
const toError = customToError ??
|
|
9
|
+
(rules.length > 0
|
|
10
|
+
? createNormalizer(rules, fallback)
|
|
11
|
+
: toAppError);
|
|
12
|
+
return {
|
|
13
|
+
run(fn, options = {}) {
|
|
14
|
+
return baseRun(fn, {
|
|
15
|
+
...options,
|
|
16
|
+
mapError: composeMapError(defaultMapError, options.mapError),
|
|
17
|
+
});
|
|
18
|
+
},
|
|
19
|
+
all(fns, options = {}) {
|
|
20
|
+
return baseRunAll(fns, {
|
|
21
|
+
...options,
|
|
22
|
+
mapError: composeMapError(defaultMapError, options.mapError),
|
|
23
|
+
});
|
|
24
|
+
},
|
|
25
|
+
allOrThrow(fns, options = {}) {
|
|
26
|
+
return baseRunAllOrThrow(fns, {
|
|
27
|
+
...options,
|
|
28
|
+
mapError: composeMapError(defaultMapError, options.mapError),
|
|
29
|
+
});
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../../src/runner/runner.ts"],"names":[],"mappings":"AACA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,GACX,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,MAAM,IAAI,UAAU,GAGrB,MAAM,UAAU,CAAC;AA4BlB,MAAM,eAAe,GACnB,CAAI,IAAkB,EAAE,KAAmB,EAAE,EAAE,CAC/C,CAAC,CAAI,EAAE,EAAE,CACP,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3D,MAAM,UAAU,YAAY,CAC1B,OAA+B,EAAE;IAEjC,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAiB,EAC7D,OAAO,EAAE,aAAa,EACtB,WAAW,GAAG,IAAI,EAClB,QAAQ,EAAE,eAAe,GAC1B,GAAG,IAAI,CAAC;IAET,MAAM,OAAO,GACX,aAAa;QACb,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACf,CAAC,CAAC,gBAAgB,CAAI,KAAK,EAAE,QAAQ,CAAC;YACtC,CAAC,CAAE,UAA2C,CAAC,CAAC;IAEpD,OAAO;QACL,GAAG,CACD,EAAoB,EACpB,UAA4B,EAAE;YAE9B,OAAO,OAAO,CAAC,EAAE,EAAE;gBACjB,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;QACD,GAAG,CACD,GAA4B,EAC5B,UAA+B,EAAE;YAEjC,OAAO,UAAU,CAAC,GAAG,EAAE;gBACrB,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;QACD,UAAU,CACR,GAAyB,EACzB,UAA4B,EAAE;YAE9B,OAAO,iBAAiB,CAAC,GAAG,EAAE;gBAC5B,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
package/dist/runner.d.ts
CHANGED
|
@@ -1,31 +1,42 @@
|
|
|
1
|
-
import type { AppError } from "
|
|
2
|
-
import type { Rule } from "
|
|
3
|
-
import type { RunOptions, RunResult } from "
|
|
4
|
-
import { type RunAllItemResult, type RunAllOptions } from "./runAll";
|
|
1
|
+
import type { AppError } from "../error/types";
|
|
2
|
+
import type { Rule } from "../error/normalize";
|
|
3
|
+
import type { RunOptions, RunResult } from "../types";
|
|
4
|
+
import { type RunAllItemResult, type RunAllOptions } from "./runner/runAll";
|
|
5
5
|
export type CreateRunnerOptions<E extends AppError = AppError> = {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
6
|
+
/**
|
|
7
|
+
* Custom matchers to use for normalizing errors.
|
|
8
|
+
* If not provided, the default matchers are used.
|
|
9
|
+
*/
|
|
10
|
+
rules?: Rule<E>[];
|
|
11
|
+
/**
|
|
12
|
+
* Custom fallback function to use for normalizing errors.
|
|
13
|
+
* If not provided, the default fallback is used.
|
|
14
|
+
*/
|
|
15
|
+
fallback?: (err: unknown) => E;
|
|
16
|
+
/**
|
|
17
|
+
* If you want a completely custom normalizer, you can provide it directly.
|
|
18
|
+
* If set, `matchers` and `fallback` are ignored.
|
|
19
|
+
*/
|
|
20
|
+
toError?: (err: unknown) => E;
|
|
21
|
+
/** Default for run options */
|
|
22
|
+
ignoreAbort?: boolean;
|
|
23
|
+
/** Optional default mapper for all runs */
|
|
24
|
+
mapError?: (error: E) => E;
|
|
25
25
|
};
|
|
26
|
-
export declare function createRunner<E extends AppError = AppError>(
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
26
|
+
export declare function createRunner<E extends AppError = AppError>(
|
|
27
|
+
opts?: CreateRunnerOptions<E>
|
|
28
|
+
): {
|
|
29
|
+
run<T>(
|
|
30
|
+
fn: () => Promise<T>,
|
|
31
|
+
options?: RunOptions<T, E>
|
|
32
|
+
): Promise<RunResult<T, E>>;
|
|
33
|
+
all<T>(
|
|
34
|
+
fns: Array<() => Promise<T>>,
|
|
35
|
+
options?: RunAllOptions<T, E>
|
|
36
|
+
): Promise<RunAllItemResult<T, E>[]>;
|
|
37
|
+
allOrThrow<T>(
|
|
38
|
+
fns: (() => Promise<T>)[],
|
|
39
|
+
options?: RunOptions<T, E>
|
|
40
|
+
): Promise<T[]>;
|
|
30
41
|
};
|
|
31
|
-
//# sourceMappingURL=runner.d.ts.map
|
|
42
|
+
//# sourceMappingURL=runner.d.ts.map
|
package/dist/runner.js
CHANGED
|
@@ -1,34 +1,43 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
import {
|
|
2
|
+
createNormalizer,
|
|
3
|
+
defaultFallback,
|
|
4
|
+
toAppError,
|
|
5
|
+
} from "./error/normalize";
|
|
6
|
+
import { run as baseRun } from "./runner/run";
|
|
7
|
+
import { runAllOrThrow as baseRunAllOrThrow } from "./runner/runAllOrThrow";
|
|
8
|
+
import { runAll as baseRunAll } from "./runner/runAll";
|
|
9
|
+
const composeMapError = (base, local) => (e) =>
|
|
10
|
+
local ? local(base ? base(e) : e) : base ? base(e) : e;
|
|
6
11
|
export function createRunner(opts = {}) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
12
|
+
const {
|
|
13
|
+
rules = [],
|
|
14
|
+
fallback = (e) => defaultFallback(e),
|
|
15
|
+
toError: customToError,
|
|
16
|
+
ignoreAbort = true,
|
|
17
|
+
mapError: defaultMapError,
|
|
18
|
+
} = opts;
|
|
19
|
+
const toError =
|
|
20
|
+
customToError ??
|
|
21
|
+
(rules.length > 0 ? createNormalizer(rules, fallback) : toAppError);
|
|
22
|
+
return {
|
|
23
|
+
run(fn, options = {}) {
|
|
24
|
+
return baseRun(fn, {
|
|
25
|
+
...options,
|
|
26
|
+
mapError: composeMapError(defaultMapError, options.mapError),
|
|
27
|
+
});
|
|
28
|
+
},
|
|
29
|
+
all(fns, options = {}) {
|
|
30
|
+
return baseRunAll(fns, {
|
|
31
|
+
...options,
|
|
32
|
+
mapError: composeMapError(defaultMapError, options.mapError),
|
|
33
|
+
});
|
|
34
|
+
},
|
|
35
|
+
allOrThrow(fns, options = {}) {
|
|
36
|
+
return baseRunAllOrThrow(fns, {
|
|
37
|
+
...options,
|
|
38
|
+
mapError: composeMapError(defaultMapError, options.mapError),
|
|
39
|
+
});
|
|
40
|
+
},
|
|
41
|
+
};
|
|
32
42
|
}
|
|
33
|
-
|
|
34
|
-
//# sourceMappingURL=runner.js.map
|
|
43
|
+
//# sourceMappingURL=runner.js.map
|
package/dist/runner.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,MAAM,IAAI,UAAU,GAGrB,MAAM,UAAU,CAAC;AA4BlB,MAAM,eAAe,GACnB,CAAI,IAAkB,EAAE,KAAmB,EAAE,EAAE,CAC/C,CAAC,CAAI,EAAE,EAAE,CACP,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3D,MAAM,UAAU,YAAY,CAC1B,OAA+B,EAAE;IAEjC,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAiB,EAC7D,OAAO,EAAE,aAAa,EACtB,WAAW,GAAG,IAAI,EAClB,QAAQ,EAAE,eAAe,GAC1B,GAAG,IAAI,CAAC;IAET,MAAM,OAAO,GACX,aAAa;QACb,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACf,CAAC,CAAC,gBAAgB,CAAI,KAAK,EAAE,QAAQ,CAAC;YACtC,CAAC,CAAE,UAA2C,CAAC,CAAC;IAEpD,OAAO;QACL,GAAG,CACD,EAAoB,EACpB,UAA4B,EAAE;YAE9B,OAAO,OAAO,CAAC,EAAE,EAAE;gBACjB,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;QACD,GAAG,CACD,GAA4B,EAC5B,UAA+B,EAAE;YAEjC,OAAO,UAAU,CAAC,GAAG,EAAE;gBACrB,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;QACD,UAAU,CACR,GAAyB,EACzB,UAA4B,EAAE;YAE9B,OAAO,iBAAiB,CAAC,GAAG,EAAE;gBAC5B,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC
|
|
1
|
+
{"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,gBAAgB,EAChB,eAAe,EACf,UAAU,GACX,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,GAAG,IAAI,OAAO,EAAE,MAAM,OAAO,CAAC;AAEvC,OAAO,EAAE,aAAa,IAAI,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EACL,MAAM,IAAI,UAAU,GAGrB,MAAM,UAAU,CAAC;AA4BlB,MAAM,eAAe,GACnB,CAAI,IAAkB,EAAE,KAAmB,EAAE,EAAE,CAC/C,CAAC,CAAI,EAAE,EAAE,CACP,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AAE3D,MAAM,UAAU,YAAY,CAC1B,OAA+B,EAAE;IAEjC,MAAM,EACJ,KAAK,GAAG,EAAE,EACV,QAAQ,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,eAAe,CAAC,CAAC,CAAiB,EAC7D,OAAO,EAAE,aAAa,EACtB,WAAW,GAAG,IAAI,EAClB,QAAQ,EAAE,eAAe,GAC1B,GAAG,IAAI,CAAC;IAET,MAAM,OAAO,GACX,aAAa;QACb,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;YACf,CAAC,CAAC,gBAAgB,CAAI,KAAK,EAAE,QAAQ,CAAC;YACtC,CAAC,CAAE,UAA2C,CAAC,CAAC;IAEpD,OAAO;QACL,GAAG,CACD,EAAoB,EACpB,UAA4B,EAAE;YAE9B,OAAO,OAAO,CAAC,EAAE,EAAE;gBACjB,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;QACD,GAAG,CACD,GAA4B,EAC5B,UAA+B,EAAE;YAEjC,OAAO,UAAU,CAAC,GAAG,EAAE;gBACrB,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;QACD,UAAU,CACR,GAAyB,EACzB,UAA4B,EAAE;YAE9B,OAAO,iBAAiB,CAAC,GAAG,EAAE;gBAC5B,GAAG,OAAO;gBACV,QAAQ,EAAE,eAAe,CAAC,eAAe,EAAE,OAAO,CAAC,QAAQ,CAAC;aAC7D,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|