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 CHANGED
@@ -1,26 +1,36 @@
1
- import { createNormalizer, defaultFallback, toAppError, } from "./error/normalize";
2
- import { run as baseRun } from "./run";
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
- const { matchers = [], fallback = (e) => defaultFallback(e), toError: customToError, ignoreAbort = true, mapError: defaultMapError, } = opts;
5
- const toError = customToError ??
6
- (matchers.length > 0
7
- ? createNormalizer(matchers, fallback)
8
- : toAppError);
9
- return {
10
- run(fn, options = {}) {
11
- return baseRun(fn, {
12
- toError,
13
- ignoreAbort,
14
- mapError: (err) => options.mapError
15
- ? options.mapError(defaultMapError ? defaultMapError(err) : err)
16
- : defaultMapError
17
- ? defaultMapError(err)
18
- : err,
19
- onError: options.onError,
20
- onSuccess: options.onSuccess,
21
- onFinally: options.onFinally,
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,MAAM,SAAS,CAAC;AAExC,MAAM,MAAM,IAAI,CAAC,CAAC,SAAS,QAAQ,GAAG,QAAQ,IAAI,CAAC,GAAG,EAAE,OAAO,KAAK,CAAC,GAAG,IAAI,CAAC;AAE7E,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
+ {"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":"AAIA,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"}
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"}
@@ -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
- export declare function matchInstance<T extends Error, Meta = unknown>(ErrorCtor: new (...args: any[]) => T, map: (e: T) => AppError<Meta>): Rule<AppError<Meta>>;
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,MAAM,SAAS,CAAC;AACxC,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAGxC,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;AAGF,wBAAgB,aAAa,CAAC,CAAC,SAAS,KAAK,EAAE,IAAI,GAAG,OAAO,EAC3D,SAAS,EAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,EACpC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,GAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAEtB"}
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"}
@@ -73,8 +73,24 @@ export const aggregateRule = (err) => {
73
73
  }
74
74
  return null;
75
75
  };
76
- // Helper para crear matcher basado en "instanceof" (plugin-friendly)
77
- export function matchInstance(ErrorCtor, map) {
78
- return (err) => (err instanceof ErrorCtor ? map(err) : null);
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
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/error/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/error/rules.ts"],"names":[],"mappings":"AAEA,uEAAuE;AACvE,MAAM,CAAC,MAAM,SAAS,GAAS,CAAC,GAAG,EAAE,EAAE;IACrC,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,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,wFAAwF;AACxF,MAAM,CAAC,MAAM,WAAW,GAAS,CAAC,GAAG,EAAE,EAAE;IACvC,IAAI,GAAG,YAAY,YAAY,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QAC/D,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mBAAmB,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC;IACvE,CAAC;IACD,qDAAqD;IACrD,IAAI,GAAG,YAAY,KAAK,IAAI,GAAG,CAAC,IAAI,KAAK,cAAc,EAAE,CAAC;QACxD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,mBAAmB;YAC3C,KAAK,EAAE,GAAG;SACX,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,4EAA4E;AAC5E,MAAM,CAAC,MAAM,WAAW,GAAS,CAAC,GAAG,EAAE,EAAE;IACvC,IACE,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,SAAS,IAAI,GAAG;QAChB,OAAQ,GAAW,CAAC,OAAO,KAAK,QAAQ,EACxC,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS;YACf,OAAO,EAAG,GAAW,CAAC,OAAO;YAC7B,KAAK,EAAE,GAAG;SACX,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,UAAU,GAAS,CAAC,GAAG,EAAE,EAAE;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG;YACZ,KAAK,EAAE,GAAG;SACX,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,UAAU,GAAS,CAAC,GAAG,EAAE,EAAE;IACtC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,KAAK,IAAI,EAAE,CAAC;QAC5C,kCAAkC;QAClC,MAAM,MAAM,GAAI,GAAW,CAAC,MAAM,IAAK,GAAW,CAAC,UAAU,CAAC;QAE9D,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAG,GAAW,CAAC,OAAO,IAAI,cAAc,MAAM,EAAE;gBACvD,MAAM;gBACN,KAAK,EAAE,GAAG;aACX,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,iDAAiD;AACjD,MAAM,CAAC,MAAM,aAAa,GAAS,CAAC,GAAG,EAAE,EAAE;IACzC,IAAI,OAAO,cAAc,KAAK,WAAW,IAAI,GAAG,YAAY,cAAc,EAAE,CAAC;QAC3E,OAAO;YACL,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,GAAG,CAAC,OAAO,IAAI,0BAA0B;YAClD,KAAK,EAAE,GAAG;YACV,IAAI,EAAE,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE;SAC7B,CAAC;IACJ,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,gBAAgB;IACpB,YAA6B,OAAmC;QAAnC,YAAO,GAAP,OAAO,CAA4B;IAAG,CAAC;IAEpE,OAAO,CAAuB,MAAuB;QACnD,OAAO,CAAC,GAAY,EAAE,EAAE;YACtB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;gBAAE,OAAO,IAAI,CAAC;YACpC,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC,CAAC;IACJ,CAAC;CACF;AAED,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,QAAQ,CAAwC,IAAO;QACrD,OAAO,IAAI,gBAAgB,CACzB,CAAC,GAAG,EAA0B,EAAE,CAAC,GAAG,YAAY,IAAI,CACrD,CAAC;IACJ,CAAC;IAED,IAAI,CAAc,SAAqC;QACrD,OAAO,IAAI,gBAAgB,CAAI,SAAS,CAAC,CAAC;IAC5C,CAAC;CACF,CAAC"}
@@ -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;AAEZ;;;;;;;;EAQC;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"}
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, matchInstance, messageRule, stringRule, statusRule, aggregateRule, } from "./error/rules";
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,YAAY,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC9C,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,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACxC,YAAY,EAAE,mBAAmB,EAAE,MAAM,UAAU,CAAC"}
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, matchInstance, messageRule, stringRule, statusRule, aggregateRule, } from "./error/rules";
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,OAAO,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAKlC,OAAO,EACL,UAAU,EACV,eAAe,EACf,gBAAgB,GACjB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,SAAS,EACT,WAAW,EACX,aAAa,EACb,WAAW,EACX,UAAU,EACV,UAAU,EACV,aAAa,GACd,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
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 "./error/types";
2
- import type { RunOptions, RunResult } from "./types";
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>(fn: () => Promise<T>, options?: RunOptions<T, E>): Promise<RunResult<T, E>>;
13
- //# sourceMappingURL=run.d.ts.map
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 "./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;
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 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
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
- 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;
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
- 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();
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
@@ -1,11 +1,17 @@
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;
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>(tasks: Array<() => Promise<T>>, options?: RunAllOrThrowOptions<T, E>): Promise<T[]>;
11
- //# sourceMappingURL=runAllOrThrow.d.ts.map
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
@@ -1,48 +1,46 @@
1
- import { run } from "./run";
1
+ import { run } from "./runner/run";
2
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
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 "./error/types";
2
- import type { Rule } from "./error/normalize";
3
- import type { RunOptions, RunResult } from "./types";
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
- * 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;
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>(opts?: CreateRunnerOptions<E>): {
27
- run<T>(fn: () => Promise<T>, options?: RunOptions<T, E>): Promise<RunResult<T, E>>;
28
- all<T>(fns: Array<() => Promise<T>>, options?: RunAllOptions<T, E>): Promise<RunAllItemResult<T, E>[]>;
29
- allOrThrow<T>(fns: (() => Promise<T>)[], options?: RunOptions<T, E>): Promise<T[]>;
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 { 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;
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
- 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
- };
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
- const runner = createRunner();
34
- //# sourceMappingURL=runner.js.map
43
+ //# sourceMappingURL=runner.js.map
@@ -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;AAED,MAAM,MAAM,GAAG,YAAY,EAAE,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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "runtry",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Run async functions and return a typed Result instead of throwing.",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",