@l3dev/result 0.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2025 Leon Semmens
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/build/all.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ import type { Err } from "./err.js";
2
+ import { type Ok } from "./ok.js";
3
+ import type { ReturnResult } from "./result.types.js";
4
+ export declare function all<TResults extends ReturnResult<any, any>[]>(...results: TResults): Extract<TResults[number], Err<any, any>> | Ok<Extract<TResults[number], Ok<any>>["value"][]>;
5
+ export declare function allAsync<TResults extends (ReturnResult<any, any> | Promise<ReturnResult<any, any>>)[]>(...results: TResults): Promise<Extract<Awaited<TResults[number]>, Err<any, any>> | Ok<Extract<Awaited<TResults[number]>, Ok<any>>["value"][]>>;
6
+ export declare function allSettledAsync<TResults extends (ReturnResult<any, any> | Promise<ReturnResult<any, any>>)[]>(...results: TResults): Promise<Awaited<TResults[number]>[]>;
7
+ export declare function allValues<TResults extends ReturnResult<any, any>[]>(...results: TResults): Extract<TResults[number], Ok<any>>["value"][];
8
+ export declare function allErrors<TResults extends ReturnResult<any, any>[]>(...results: TResults): Extract<TResults[number], Err<any, any>>[];
package/build/all.js ADDED
@@ -0,0 +1,48 @@
1
+ import { ok } from "./ok.js";
2
+ export function all(...results) {
3
+ const values = [];
4
+ for (const result of results) {
5
+ if (!result.ok) {
6
+ return result;
7
+ }
8
+ values.push(result.value);
9
+ }
10
+ return ok(values);
11
+ }
12
+ export async function allAsync(...results) {
13
+ const values = [];
14
+ for (const asyncResult of results) {
15
+ const result = await asyncResult;
16
+ if (!result.ok) {
17
+ return result;
18
+ }
19
+ values.push(result.value);
20
+ }
21
+ return ok(values);
22
+ }
23
+ export async function allSettledAsync(...results) {
24
+ const settled = [];
25
+ for (const asyncResult of results) {
26
+ settled.push((await asyncResult));
27
+ }
28
+ return settled;
29
+ }
30
+ export function allValues(...results) {
31
+ const values = [];
32
+ for (const result of results) {
33
+ if (result.ok) {
34
+ values.push(result.value);
35
+ }
36
+ }
37
+ return values;
38
+ }
39
+ export function allErrors(...results) {
40
+ const errs = [];
41
+ for (const result of results) {
42
+ if (!result.ok) {
43
+ errs.push(result);
44
+ }
45
+ }
46
+ return errs;
47
+ }
48
+ //# sourceMappingURL=all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"all.js","sourceRoot":"","sources":["../src/all.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAW,MAAM,SAAS,CAAC;AAGtC,MAAM,UAAU,GAAG,CAClB,GAAG,OAAiB;IAEpB,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,MAAkD,CAAC;QAC3D,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,QAAQ,CAG7B,GAAG,OAAiB;IAKpB,MAAM,MAAM,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QACjC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YAChB,OAAO,MAA2D,CAAC;QACpE,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,OAAO,EAAE,CAAC,MAAM,CAAC,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAEnC,GAAG,OAAiB;IACrB,MAAM,OAAO,GAAgC,EAAE,CAAC;IAChD,KAAK,MAAM,WAAW,IAAI,OAAO,EAAE,CAAC;QACnC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,WAAW,CAA8B,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,OAAO,CAAC;AAChB,CAAC;AAED,MAAM,UAAU,SAAS,CACxB,GAAG,OAAiB;IAEpB,MAAM,MAAM,GAAU,EAAE,CAAC;IACzB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;IACF,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CACxB,GAAG,OAAiB;IAEpB,MAAM,IAAI,GAAoB,EAAE,CAAC;IACjC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;YAChB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACnB,CAAC;IACF,CAAC;IACD,OAAO,IAAkD,CAAC;AAC3D,CAAC","sourcesContent":["import type { Err } from \"./err.js\";\nimport { ok, type Ok } from \"./ok.js\";\nimport type { ReturnResult } from \"./result.types.js\";\n\nexport function all<TResults extends ReturnResult<any, any>[]>(\n\t...results: TResults\n): Extract<TResults[number], Err<any, any>> | Ok<Extract<TResults[number], Ok<any>>[\"value\"][]> {\n\tconst values = [];\n\tfor (const result of results) {\n\t\tif (!result.ok) {\n\t\t\treturn result as Extract<TResults[number], Err<any, any>>;\n\t\t}\n\t\tvalues.push(result.value);\n\t}\n\treturn ok(values);\n}\n\nexport async function allAsync<\n\tTResults extends (ReturnResult<any, any> | Promise<ReturnResult<any, any>>)[]\n>(\n\t...results: TResults\n): Promise<\n\t| Extract<Awaited<TResults[number]>, Err<any, any>>\n\t| Ok<Extract<Awaited<TResults[number]>, Ok<any>>[\"value\"][]>\n> {\n\tconst values = [];\n\tfor (const asyncResult of results) {\n\t\tconst result = await asyncResult;\n\t\tif (!result.ok) {\n\t\t\treturn result as Extract<Awaited<TResults[number]>, Err<any, any>>;\n\t\t}\n\t\tvalues.push(result.value);\n\t}\n\treturn ok(values);\n}\n\nexport async function allSettledAsync<\n\tTResults extends (ReturnResult<any, any> | Promise<ReturnResult<any, any>>)[]\n>(...results: TResults): Promise<Awaited<TResults[number]>[]> {\n\tconst settled: Awaited<TResults[number]>[] = [];\n\tfor (const asyncResult of results) {\n\t\tsettled.push((await asyncResult) as Awaited<TResults[number]>);\n\t}\n\treturn settled;\n}\n\nexport function allValues<TResults extends ReturnResult<any, any>[]>(\n\t...results: TResults\n): Extract<TResults[number], Ok<any>>[\"value\"][] {\n\tconst values: any[] = [];\n\tfor (const result of results) {\n\t\tif (result.ok) {\n\t\t\tvalues.push(result.value);\n\t\t}\n\t}\n\treturn values;\n}\n\nexport function allErrors<TResults extends ReturnResult<any, any>[]>(\n\t...results: TResults\n): Extract<TResults[number], Err<any, any>>[] {\n\tconst errs: Err<any, any>[] = [];\n\tfor (const result of results) {\n\t\tif (!result.ok) {\n\t\t\terrs.push(result);\n\t\t}\n\t}\n\treturn errs as Extract<TResults[number], Err<any, any>>[];\n}\n"]}
package/build/err.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export type Err<TType, TContext> = {
2
+ ok: false;
3
+ type: TType;
4
+ context: TContext;
5
+ };
6
+ export declare function err<const TType>(type: TType): Err<TType, null>;
7
+ export declare function err<const TType, TContext>(type: TType, context: TContext): Err<TType, TContext>;
package/build/err.js ADDED
@@ -0,0 +1,4 @@
1
+ export function err(type, context) {
2
+ return { ok: false, type, context: context ?? null };
3
+ }
4
+ //# sourceMappingURL=err.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"err.js","sourceRoot":"","sources":["../src/err.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,GAAG,CAClB,IAAW,EACX,OAAkB;IAElB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,CAAC;AACtD,CAAC","sourcesContent":["export type Err<TType, TContext> = {\n\tok: false;\n\ttype: TType;\n\tcontext: TContext;\n};\n\nexport function err<const TType>(type: TType): Err<TType, null>;\nexport function err<const TType, TContext>(type: TType, context: TContext): Err<TType, TContext>;\nexport function err<const TType, TContext>(\n\ttype: TType,\n\tcontext?: TContext\n): Err<TType, TContext | null> {\n\treturn { ok: false, type, context: context ?? null };\n}\n"]}
package/build/fn.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ import type { ReturnResult } from "./result.types.js";
2
+ export declare function fn<TResult extends ReturnResult<any, any> | Promise<ReturnResult<any, any>>, TFn extends (...args: any[]) => TResult>(fn: TFn): TFn;
package/build/fn.js ADDED
@@ -0,0 +1,29 @@
1
+ const SHOULD_NEVER_THROW_MESSAGE = "A result function should never throw an error";
2
+ export function fn(fn) {
3
+ return function (...args) {
4
+ let result;
5
+ try {
6
+ result = fn.call(this, ...args);
7
+ }
8
+ catch (error) {
9
+ throw new Error(SHOULD_NEVER_THROW_MESSAGE, {
10
+ cause: error
11
+ });
12
+ }
13
+ if (result instanceof Promise) {
14
+ // eslint-disable-next-line no-async-promise-executor
15
+ return new Promise(async (resolve, reject) => {
16
+ try {
17
+ resolve(await result);
18
+ }
19
+ catch (error) {
20
+ reject(new Error(SHOULD_NEVER_THROW_MESSAGE, {
21
+ cause: error
22
+ }));
23
+ }
24
+ });
25
+ }
26
+ return result;
27
+ };
28
+ }
29
+ //# sourceMappingURL=fn.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fn.js","sourceRoot":"","sources":["../src/fn.ts"],"names":[],"mappings":"AAEA,MAAM,0BAA0B,GAAG,+CAA+C,CAAC;AAEnF,MAAM,UAAU,EAAE,CAGhB,EAAO;IACR,OAAO,UAAwC,GAAG,IAAqB;QACtE,IAAI,MAAM,CAAC;QACX,IAAI,CAAC;YACJ,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,CAAC;QACjC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CAAC,0BAA0B,EAAE;gBAC3C,KAAK,EAAE,KAAK;aACZ,CAAC,CAAC;QACJ,CAAC;QAED,IAAI,MAAM,YAAY,OAAO,EAAE,CAAC;YAC/B,qDAAqD;YACrD,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE;gBAC5C,IAAI,CAAC;oBACJ,OAAO,CAAC,MAAM,MAAM,CAAC,CAAC;gBACvB,CAAC;gBAAC,OAAO,KAAK,EAAE,CAAC;oBAChB,MAAM,CACL,IAAI,KAAK,CAAC,0BAA0B,EAAE;wBACrC,KAAK,EAAE,KAAK;qBACZ,CAAC,CACF,CAAC;gBACH,CAAC;YACF,CAAC,CAAC,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,CAAC;IACf,CAAQ,CAAC;AACV,CAAC","sourcesContent":["import type { ReturnResult } from \"./result.types.js\";\n\nconst SHOULD_NEVER_THROW_MESSAGE = \"A result function should never throw an error\";\n\nexport function fn<\n\tTResult extends ReturnResult<any, any> | Promise<ReturnResult<any, any>>,\n\tTFn extends (...args: any[]) => TResult\n>(fn: TFn): TFn {\n\treturn function (this: ThisParameterType<TFn>, ...args: Parameters<TFn>) {\n\t\tlet result;\n\t\ttry {\n\t\t\tresult = fn.call(this, ...args);\n\t\t} catch (error) {\n\t\t\tthrow new Error(SHOULD_NEVER_THROW_MESSAGE, {\n\t\t\t\tcause: error\n\t\t\t});\n\t\t}\n\n\t\tif (result instanceof Promise) {\n\t\t\t// eslint-disable-next-line no-async-promise-executor\n\t\t\treturn new Promise(async (resolve, reject) => {\n\t\t\t\ttry {\n\t\t\t\t\tresolve(await result);\n\t\t\t\t} catch (error) {\n\t\t\t\t\treject(\n\t\t\t\t\t\tnew Error(SHOULD_NEVER_THROW_MESSAGE, {\n\t\t\t\t\t\t\tcause: error\n\t\t\t\t\t\t})\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\treturn result;\n\t} as TFn;\n}\n"]}
@@ -0,0 +1,30 @@
1
+ import { all, allAsync, allErrors, allSettledAsync, allValues } from "./all.js";
2
+ import { err, type Err } from "./err.js";
3
+ import { fn } from "./fn.js";
4
+ import { ok, type Ok } from "./ok.js";
5
+ import { pipe } from "./pipe.js";
6
+ import { pipeAsync } from "./pipeAsync.js";
7
+ import { fromPromise } from "./promise.js";
8
+ import type { ReturnResult } from "./result.types.js";
9
+ export * from "./ok.js";
10
+ export * from "./err.js";
11
+ export * from "./result.types.js";
12
+ declare function unwrapOrDefault<TResult extends ReturnResult<any, any>, TValue = TResult extends Ok<infer TValue> ? TValue : never>(result: TResult, defaultValue: NoInfer<TValue>): TValue;
13
+ declare function isOk<TResult extends ReturnResult<any, any>>(result: TResult): result is Extract<TResult, Ok<any>>;
14
+ declare function isErr<TResult extends ReturnResult<any, any>>(result: TResult): result is Extract<TResult, Err<any, any>>;
15
+ export declare const Result: {
16
+ ok: typeof ok;
17
+ err: typeof err;
18
+ pipe: typeof pipe;
19
+ pipeAsync: typeof pipeAsync;
20
+ fn: typeof fn;
21
+ fromPromise: typeof fromPromise;
22
+ unwrapOrDefault: typeof unwrapOrDefault;
23
+ all: typeof all;
24
+ allAsync: typeof allAsync;
25
+ allSettledAsync: typeof allSettledAsync;
26
+ allValues: typeof allValues;
27
+ allErrors: typeof allErrors;
28
+ isOk: typeof isOk;
29
+ isErr: typeof isErr;
30
+ };
package/build/index.js ADDED
@@ -0,0 +1,36 @@
1
+ import { all, allAsync, allErrors, allSettledAsync, allValues } from "./all.js";
2
+ import { err } from "./err.js";
3
+ import { fn } from "./fn.js";
4
+ import { ok } from "./ok.js";
5
+ import { pipe } from "./pipe.js";
6
+ import { pipeAsync } from "./pipeAsync.js";
7
+ import { fromPromise } from "./promise.js";
8
+ export * from "./ok.js";
9
+ export * from "./err.js";
10
+ export * from "./result.types.js";
11
+ function unwrapOrDefault(result, defaultValue) {
12
+ return result.ok ? result.value : defaultValue;
13
+ }
14
+ function isOk(result) {
15
+ return result.ok;
16
+ }
17
+ function isErr(result) {
18
+ return !result.ok;
19
+ }
20
+ export const Result = {
21
+ ok,
22
+ err,
23
+ pipe,
24
+ pipeAsync,
25
+ fn,
26
+ fromPromise,
27
+ unwrapOrDefault,
28
+ all,
29
+ allAsync,
30
+ allSettledAsync,
31
+ allValues,
32
+ allErrors,
33
+ isOk,
34
+ isErr
35
+ };
36
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAChF,OAAO,EAAE,GAAG,EAAY,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,EAAE,EAAW,MAAM,SAAS,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAG3C,cAAc,SAAS,CAAC;AACxB,cAAc,UAAU,CAAC;AACzB,cAAc,mBAAmB,CAAC;AAElC,SAAS,eAAe,CAGtB,MAAe,EAAE,YAA6B;IAC/C,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC;AAChD,CAAC;AAED,SAAS,IAAI,CACZ,MAAe;IAEf,OAAO,MAAM,CAAC,EAAE,CAAC;AAClB,CAAC;AAED,SAAS,KAAK,CACb,MAAe;IAEf,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,MAAM,MAAM,GAAG;IACrB,EAAE;IACF,GAAG;IACH,IAAI;IACJ,SAAS;IACT,EAAE;IACF,WAAW;IACX,eAAe;IACf,GAAG;IACH,QAAQ;IACR,eAAe;IACf,SAAS;IACT,SAAS;IACT,IAAI;IACJ,KAAK;CACL,CAAC","sourcesContent":["import { all, allAsync, allErrors, allSettledAsync, allValues } from \"./all.js\";\nimport { err, type Err } from \"./err.js\";\nimport { fn } from \"./fn.js\";\nimport { ok, type Ok } from \"./ok.js\";\nimport { pipe } from \"./pipe.js\";\nimport { pipeAsync } from \"./pipeAsync.js\";\nimport { fromPromise } from \"./promise.js\";\nimport type { ReturnResult } from \"./result.types.js\";\n\nexport * from \"./ok.js\";\nexport * from \"./err.js\";\nexport * from \"./result.types.js\";\n\nfunction unwrapOrDefault<\n\tTResult extends ReturnResult<any, any>,\n\tTValue = TResult extends Ok<infer TValue> ? TValue : never\n>(result: TResult, defaultValue: NoInfer<TValue>): TValue {\n\treturn result.ok ? result.value : defaultValue;\n}\n\nfunction isOk<TResult extends ReturnResult<any, any>>(\n\tresult: TResult\n): result is Extract<TResult, Ok<any>> {\n\treturn result.ok;\n}\n\nfunction isErr<TResult extends ReturnResult<any, any>>(\n\tresult: TResult\n): result is Extract<TResult, Err<any, any>> {\n\treturn !result.ok;\n}\n\nexport const Result = {\n\tok,\n\terr,\n\tpipe,\n\tpipeAsync,\n\tfn,\n\tfromPromise,\n\tunwrapOrDefault,\n\tall,\n\tallAsync,\n\tallSettledAsync,\n\tallValues,\n\tallErrors,\n\tisOk,\n\tisErr\n};\n"]}
package/build/ok.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export type Ok<TValue> = {
2
+ ok: true;
3
+ value: TValue;
4
+ };
5
+ export type None = Ok<null>;
6
+ export declare function ok<TValue>(value: TValue): Ok<TValue>;
7
+ export declare const NONE: None;
package/build/ok.js ADDED
@@ -0,0 +1,5 @@
1
+ export function ok(value) {
2
+ return { ok: true, value };
3
+ }
4
+ export const NONE = ok(null);
5
+ //# sourceMappingURL=ok.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ok.js","sourceRoot":"","sources":["../src/ok.ts"],"names":[],"mappings":"AAOA,MAAM,UAAU,EAAE,CAAS,KAAa;IACvC,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AAC5B,CAAC;AAED,MAAM,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAS,CAAC","sourcesContent":["export type Ok<TValue> = {\n\tok: true;\n\tvalue: TValue;\n};\n\nexport type None = Ok<null>;\n\nexport function ok<TValue>(value: TValue): Ok<TValue> {\n\treturn { ok: true, value };\n}\n\nexport const NONE = ok(null) as None;\n"]}
@@ -0,0 +1,20 @@
1
+ import type { Err } from "./err.js";
2
+ import { type Ok } from "./ok.js";
3
+ import type { ResultFn } from "./result.types.js";
4
+ export type PipelineResult<TFns> = TFns extends [
5
+ ...infer InterFns extends ResultFn[],
6
+ infer LastFn extends ResultFn
7
+ ] ? Extract<ReturnType<InterFns[number]>, Err<any, any>> | ReturnType<LastFn> : never;
8
+ export type PipelineFn<TFns extends ResultFn[]> = (...input: Parameters<TFns[0]>) => PipelineResult<TFns>;
9
+ export type StepFn<TPreviousFn extends ResultFn> = ResultFn<[
10
+ Extract<ReturnType<TPreviousFn>, Ok<any>>["value"]
11
+ ]>;
12
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>>(fnA: FnA, fnB: FnB): PipelineFn<[FnA, FnB]>;
13
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>>(fnA: FnA, fnB: FnB, fnC: FnC): PipelineFn<[FnA, FnB, FnC]>;
14
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>, FnD extends StepFn<FnC>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD): PipelineFn<[FnA, FnB, FnC, FnD]>;
15
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>, FnD extends StepFn<FnC>, FnE extends StepFn<FnD>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE): PipelineFn<[FnA, FnB, FnC, FnD, FnE]>;
16
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>, FnD extends StepFn<FnC>, FnE extends StepFn<FnD>, FnF extends StepFn<FnE>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF]>;
17
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>, FnD extends StepFn<FnC>, FnE extends StepFn<FnD>, FnF extends StepFn<FnE>, FnG extends StepFn<FnF>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF, fnG: FnG): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG]>;
18
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>, FnD extends StepFn<FnC>, FnE extends StepFn<FnD>, FnF extends StepFn<FnE>, FnG extends StepFn<FnF>, FnH extends StepFn<FnG>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF, fnG: FnG, fnH: FnH): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH]>;
19
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>, FnD extends StepFn<FnC>, FnE extends StepFn<FnD>, FnF extends StepFn<FnE>, FnG extends StepFn<FnF>, FnH extends StepFn<FnG>, FnI extends StepFn<FnH>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF, fnG: FnG, fnH: FnH, fnI: FnI): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH, FnI]>;
20
+ export declare function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>, FnD extends StepFn<FnC>, FnE extends StepFn<FnD>, FnF extends StepFn<FnE>, FnG extends StepFn<FnF>, FnH extends StepFn<FnG>, FnI extends StepFn<FnH>, FnJ extends StepFn<FnI>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF, fnG: FnG, fnH: FnH, fnI: FnI, fnJ: FnJ): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH, FnI, FnJ]>;
package/build/pipe.js ADDED
@@ -0,0 +1,23 @@
1
+ import { ok } from "./ok.js";
2
+ export function pipe(...fns) {
3
+ return ((...input) => {
4
+ let value;
5
+ {
6
+ const result = fns[0](...input);
7
+ if (!result.ok) {
8
+ return result;
9
+ }
10
+ value = result.value;
11
+ }
12
+ for (let i = 1; i < fns.length; i++) {
13
+ const fn = fns[i];
14
+ const result = fn(value);
15
+ if (!result.ok) {
16
+ return result;
17
+ }
18
+ value = result.value;
19
+ }
20
+ return ok(value);
21
+ });
22
+ }
23
+ //# sourceMappingURL=pipe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipe.js","sourceRoot":"","sources":["../src/pipe.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAW,MAAM,SAAS,CAAC;AAuItC,MAAM,UAAU,IAAI,CAAgC,GAAG,GAAS;IAC/D,OAAO,CAAC,CAAC,GAAG,KAA0B,EAAE,EAAE;QACzC,IAAI,KAAK,CAAC;QACV,CAAC;YACA,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;YAChC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC;YACf,CAAC;YACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,MAAM,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC;YACf,CAAC;YACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,CAAqB,CAAC;AACxB,CAAC","sourcesContent":["import type { Err } from \"./err.js\";\nimport { ok, type Ok } from \"./ok.js\";\nimport type { ResultFn } from \"./result.types.js\";\n\nexport type PipelineResult<TFns> = TFns extends [\n\t...infer InterFns extends ResultFn[],\n\tinfer LastFn extends ResultFn\n]\n\t? Extract<ReturnType<InterFns[number]>, Err<any, any>> | ReturnType<LastFn>\n\t: never;\n\nexport type PipelineFn<TFns extends ResultFn[]> = (\n\t...input: Parameters<TFns[0]>\n) => PipelineResult<TFns>;\n\nexport type StepFn<TPreviousFn extends ResultFn> = ResultFn<\n\t[Extract<ReturnType<TPreviousFn>, Ok<any>>[\"value\"]]\n>;\n\nexport function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>>(\n\tfnA: FnA,\n\tfnB: FnB\n): PipelineFn<[FnA, FnB]>;\nexport function pipe<FnA extends ResultFn, FnB extends StepFn<FnA>, FnC extends StepFn<FnB>>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC\n): PipelineFn<[FnA, FnB, FnC]>;\nexport function pipe<\n\tFnA extends ResultFn,\n\tFnB extends StepFn<FnA>,\n\tFnC extends StepFn<FnB>,\n\tFnD extends StepFn<FnC>\n>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD): PipelineFn<[FnA, FnB, FnC, FnD]>;\nexport function pipe<\n\tFnA extends ResultFn,\n\tFnB extends StepFn<FnA>,\n\tFnC extends StepFn<FnB>,\n\tFnD extends StepFn<FnC>,\n\tFnE extends StepFn<FnD>\n>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE): PipelineFn<[FnA, FnB, FnC, FnD, FnE]>;\nexport function pipe<\n\tFnA extends ResultFn,\n\tFnB extends StepFn<FnA>,\n\tFnC extends StepFn<FnB>,\n\tFnD extends StepFn<FnC>,\n\tFnE extends StepFn<FnD>,\n\tFnF extends StepFn<FnE>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF\n): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF]>;\nexport function pipe<\n\tFnA extends ResultFn,\n\tFnB extends StepFn<FnA>,\n\tFnC extends StepFn<FnB>,\n\tFnD extends StepFn<FnC>,\n\tFnE extends StepFn<FnD>,\n\tFnF extends StepFn<FnE>,\n\tFnG extends StepFn<FnF>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF,\n\tfnG: FnG\n): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG]>;\nexport function pipe<\n\tFnA extends ResultFn,\n\tFnB extends StepFn<FnA>,\n\tFnC extends StepFn<FnB>,\n\tFnD extends StepFn<FnC>,\n\tFnE extends StepFn<FnD>,\n\tFnF extends StepFn<FnE>,\n\tFnG extends StepFn<FnF>,\n\tFnH extends StepFn<FnG>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF,\n\tfnG: FnG,\n\tfnH: FnH\n): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH]>;\nexport function pipe<\n\tFnA extends ResultFn,\n\tFnB extends StepFn<FnA>,\n\tFnC extends StepFn<FnB>,\n\tFnD extends StepFn<FnC>,\n\tFnE extends StepFn<FnD>,\n\tFnF extends StepFn<FnE>,\n\tFnG extends StepFn<FnF>,\n\tFnH extends StepFn<FnG>,\n\tFnI extends StepFn<FnH>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF,\n\tfnG: FnG,\n\tfnH: FnH,\n\tfnI: FnI\n): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH, FnI]>;\nexport function pipe<\n\tFnA extends ResultFn,\n\tFnB extends StepFn<FnA>,\n\tFnC extends StepFn<FnB>,\n\tFnD extends StepFn<FnC>,\n\tFnE extends StepFn<FnD>,\n\tFnF extends StepFn<FnE>,\n\tFnG extends StepFn<FnF>,\n\tFnH extends StepFn<FnG>,\n\tFnI extends StepFn<FnH>,\n\tFnJ extends StepFn<FnI>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF,\n\tfnG: FnG,\n\tfnH: FnH,\n\tfnI: FnI,\n\tfnJ: FnJ\n): PipelineFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH, FnI, FnJ]>;\nexport function pipe<const TFns extends ResultFn[]>(...fns: TFns): PipelineFn<TFns> {\n\treturn ((...input: Parameters<TFns[0]>) => {\n\t\tlet value;\n\t\t{\n\t\t\tconst result = fns[0](...input);\n\t\t\tif (!result.ok) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tvalue = result.value;\n\t\t}\n\t\tfor (let i = 1; i < fns.length; i++) {\n\t\t\tconst fn = fns[i];\n\t\t\tconst result = fn(value);\n\t\t\tif (!result.ok) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tvalue = result.value;\n\t\t}\n\t\treturn ok(value);\n\t}) as PipelineFn<TFns>;\n}\n"]}
@@ -0,0 +1,20 @@
1
+ import type { Err } from "./err.js";
2
+ import { type Ok } from "./ok.js";
3
+ import type { ResultAsyncFn } from "./result.types.js";
4
+ export type PipelineResultAsync<TFns> = TFns extends [
5
+ ...infer InterFns extends ResultAsyncFn[],
6
+ infer LastFn extends ResultAsyncFn
7
+ ] ? Promise<Extract<Awaited<ReturnType<InterFns[number]>>, Err<any, any>> | Awaited<ReturnType<LastFn>>> : never;
8
+ export type PipelineAsyncFn<TFns extends ResultAsyncFn[]> = (...input: Parameters<TFns[0]>) => PipelineResultAsync<TFns>;
9
+ export type StepAsyncFn<TPreviousFn extends ResultAsyncFn> = ResultAsyncFn<[
10
+ Extract<Awaited<ReturnType<TPreviousFn>>, Ok<any>>["value"]
11
+ ]>;
12
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>>(fnA: FnA, fnB: FnB): PipelineAsyncFn<[FnA, FnB]>;
13
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>, FnC extends StepAsyncFn<FnB>>(fnA: FnA, fnB: FnB, fnC: FnC): PipelineAsyncFn<[FnA, FnB, FnC]>;
14
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>, FnC extends StepAsyncFn<FnB>, FnD extends StepAsyncFn<FnC>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD): PipelineAsyncFn<[FnA, FnB, FnC, FnD]>;
15
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>, FnC extends StepAsyncFn<FnB>, FnD extends StepAsyncFn<FnC>, FnE extends StepAsyncFn<FnD>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE]>;
16
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>, FnC extends StepAsyncFn<FnB>, FnD extends StepAsyncFn<FnC>, FnE extends StepAsyncFn<FnD>, FnF extends StepAsyncFn<FnE>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF]>;
17
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>, FnC extends StepAsyncFn<FnB>, FnD extends StepAsyncFn<FnC>, FnE extends StepAsyncFn<FnD>, FnF extends StepAsyncFn<FnE>, FnG extends StepAsyncFn<FnF>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF, fnG: FnG): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG]>;
18
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>, FnC extends StepAsyncFn<FnB>, FnD extends StepAsyncFn<FnC>, FnE extends StepAsyncFn<FnD>, FnF extends StepAsyncFn<FnE>, FnG extends StepAsyncFn<FnF>, FnH extends StepAsyncFn<FnG>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF, fnG: FnG, fnH: FnH): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH]>;
19
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>, FnC extends StepAsyncFn<FnB>, FnD extends StepAsyncFn<FnC>, FnE extends StepAsyncFn<FnD>, FnF extends StepAsyncFn<FnE>, FnG extends StepAsyncFn<FnF>, FnH extends StepAsyncFn<FnG>, FnI extends StepAsyncFn<FnH>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF, fnG: FnG, fnH: FnH, fnI: FnI): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH, FnI]>;
20
+ export declare function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>, FnC extends StepAsyncFn<FnB>, FnD extends StepAsyncFn<FnC>, FnE extends StepAsyncFn<FnD>, FnF extends StepAsyncFn<FnE>, FnG extends StepAsyncFn<FnF>, FnH extends StepAsyncFn<FnG>, FnI extends StepAsyncFn<FnH>, FnJ extends StepAsyncFn<FnI>>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE, fnF: FnF, fnG: FnG, fnH: FnH, fnI: FnI, fnJ: FnJ): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH, FnI, FnJ]>;
@@ -0,0 +1,23 @@
1
+ import { ok } from "./ok.js";
2
+ export function pipeAsync(...fns) {
3
+ return (async (...input) => {
4
+ let value;
5
+ {
6
+ const result = await fns[0](...input);
7
+ if (!result.ok) {
8
+ return result;
9
+ }
10
+ value = result.value;
11
+ }
12
+ for (let i = 1; i < fns.length; i++) {
13
+ const fn = fns[i];
14
+ const result = await fn(value);
15
+ if (!result.ok) {
16
+ return result;
17
+ }
18
+ value = result.value;
19
+ }
20
+ return ok(value);
21
+ });
22
+ }
23
+ //# sourceMappingURL=pipeAsync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pipeAsync.js","sourceRoot":"","sources":["../src/pipeAsync.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,EAAE,EAAW,MAAM,SAAS,CAAC;AAyItC,MAAM,UAAU,SAAS,CAAqC,GAAG,GAAS;IACzE,OAAO,CAAC,KAAK,EAAE,GAAG,KAA0B,EAAE,EAAE;QAC/C,IAAI,KAAK,CAAC;QACV,CAAC;YACA,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;YACtC,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC;YACf,CAAC;YACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACrC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;YAClB,MAAM,MAAM,GAAG,MAAM,EAAE,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;gBAChB,OAAO,MAAM,CAAC;YACf,CAAC;YACD,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC,CAA0B,CAAC;AAC7B,CAAC","sourcesContent":["import type { Err } from \"./err.js\";\nimport { ok, type Ok } from \"./ok.js\";\nimport type { ResultAsyncFn } from \"./result.types.js\";\n\nexport type PipelineResultAsync<TFns> = TFns extends [\n\t...infer InterFns extends ResultAsyncFn[],\n\tinfer LastFn extends ResultAsyncFn\n]\n\t? Promise<\n\t\t\tExtract<Awaited<ReturnType<InterFns[number]>>, Err<any, any>> | Awaited<ReturnType<LastFn>>\n\t\t>\n\t: never;\n\nexport type PipelineAsyncFn<TFns extends ResultAsyncFn[]> = (\n\t...input: Parameters<TFns[0]>\n) => PipelineResultAsync<TFns>;\n\nexport type StepAsyncFn<TPreviousFn extends ResultAsyncFn> = ResultAsyncFn<\n\t[Extract<Awaited<ReturnType<TPreviousFn>>, Ok<any>>[\"value\"]]\n>;\n\nexport function pipeAsync<FnA extends ResultAsyncFn, FnB extends StepAsyncFn<FnA>>(\n\tfnA: FnA,\n\tfnB: FnB\n): PipelineAsyncFn<[FnA, FnB]>;\nexport function pipeAsync<\n\tFnA extends ResultAsyncFn,\n\tFnB extends StepAsyncFn<FnA>,\n\tFnC extends StepAsyncFn<FnB>\n>(fnA: FnA, fnB: FnB, fnC: FnC): PipelineAsyncFn<[FnA, FnB, FnC]>;\nexport function pipeAsync<\n\tFnA extends ResultAsyncFn,\n\tFnB extends StepAsyncFn<FnA>,\n\tFnC extends StepAsyncFn<FnB>,\n\tFnD extends StepAsyncFn<FnC>\n>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD): PipelineAsyncFn<[FnA, FnB, FnC, FnD]>;\nexport function pipeAsync<\n\tFnA extends ResultAsyncFn,\n\tFnB extends StepAsyncFn<FnA>,\n\tFnC extends StepAsyncFn<FnB>,\n\tFnD extends StepAsyncFn<FnC>,\n\tFnE extends StepAsyncFn<FnD>\n>(fnA: FnA, fnB: FnB, fnC: FnC, fnD: FnD, fnE: FnE): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE]>;\nexport function pipeAsync<\n\tFnA extends ResultAsyncFn,\n\tFnB extends StepAsyncFn<FnA>,\n\tFnC extends StepAsyncFn<FnB>,\n\tFnD extends StepAsyncFn<FnC>,\n\tFnE extends StepAsyncFn<FnD>,\n\tFnF extends StepAsyncFn<FnE>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF\n): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF]>;\nexport function pipeAsync<\n\tFnA extends ResultAsyncFn,\n\tFnB extends StepAsyncFn<FnA>,\n\tFnC extends StepAsyncFn<FnB>,\n\tFnD extends StepAsyncFn<FnC>,\n\tFnE extends StepAsyncFn<FnD>,\n\tFnF extends StepAsyncFn<FnE>,\n\tFnG extends StepAsyncFn<FnF>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF,\n\tfnG: FnG\n): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG]>;\nexport function pipeAsync<\n\tFnA extends ResultAsyncFn,\n\tFnB extends StepAsyncFn<FnA>,\n\tFnC extends StepAsyncFn<FnB>,\n\tFnD extends StepAsyncFn<FnC>,\n\tFnE extends StepAsyncFn<FnD>,\n\tFnF extends StepAsyncFn<FnE>,\n\tFnG extends StepAsyncFn<FnF>,\n\tFnH extends StepAsyncFn<FnG>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF,\n\tfnG: FnG,\n\tfnH: FnH\n): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH]>;\nexport function pipeAsync<\n\tFnA extends ResultAsyncFn,\n\tFnB extends StepAsyncFn<FnA>,\n\tFnC extends StepAsyncFn<FnB>,\n\tFnD extends StepAsyncFn<FnC>,\n\tFnE extends StepAsyncFn<FnD>,\n\tFnF extends StepAsyncFn<FnE>,\n\tFnG extends StepAsyncFn<FnF>,\n\tFnH extends StepAsyncFn<FnG>,\n\tFnI extends StepAsyncFn<FnH>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF,\n\tfnG: FnG,\n\tfnH: FnH,\n\tfnI: FnI\n): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH, FnI]>;\nexport function pipeAsync<\n\tFnA extends ResultAsyncFn,\n\tFnB extends StepAsyncFn<FnA>,\n\tFnC extends StepAsyncFn<FnB>,\n\tFnD extends StepAsyncFn<FnC>,\n\tFnE extends StepAsyncFn<FnD>,\n\tFnF extends StepAsyncFn<FnE>,\n\tFnG extends StepAsyncFn<FnF>,\n\tFnH extends StepAsyncFn<FnG>,\n\tFnI extends StepAsyncFn<FnH>,\n\tFnJ extends StepAsyncFn<FnI>\n>(\n\tfnA: FnA,\n\tfnB: FnB,\n\tfnC: FnC,\n\tfnD: FnD,\n\tfnE: FnE,\n\tfnF: FnF,\n\tfnG: FnG,\n\tfnH: FnH,\n\tfnI: FnI,\n\tfnJ: FnJ\n): PipelineAsyncFn<[FnA, FnB, FnC, FnD, FnE, FnF, FnG, FnH, FnI, FnJ]>;\nexport function pipeAsync<const TFns extends ResultAsyncFn[]>(...fns: TFns): PipelineAsyncFn<TFns> {\n\treturn (async (...input: Parameters<TFns[0]>) => {\n\t\tlet value;\n\t\t{\n\t\t\tconst result = await fns[0](...input);\n\t\t\tif (!result.ok) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tvalue = result.value;\n\t\t}\n\t\tfor (let i = 1; i < fns.length; i++) {\n\t\t\tconst fn = fns[i];\n\t\t\tconst result = await fn(value);\n\t\t\tif (!result.ok) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t\tvalue = result.value;\n\t\t}\n\t\treturn ok(value);\n\t}) as PipelineAsyncFn<TFns>;\n}\n"]}
@@ -0,0 +1,12 @@
1
+ import type { ResultErrorDefinition, ReturnResult } from "./result.types.js";
2
+ export declare function fromPromise<TPromise extends Promise<any>, TError = Error>(promise: TPromise): Promise<ReturnResult<Awaited<TPromise>, ResultErrorDefinition<null, {
3
+ error: TError;
4
+ }>>>;
5
+ export declare function fromPromise<TPromise extends Promise<any>, const TType, TContext extends object, TError = Error>(config: {
6
+ onError: {
7
+ type: TType;
8
+ context?: TContext;
9
+ };
10
+ }, promise: TPromise): Promise<ReturnResult<Awaited<TPromise>, ResultErrorDefinition<TType, TContext & {
11
+ error: TError;
12
+ }>>>;
@@ -0,0 +1,22 @@
1
+ import { err } from "./err.js";
2
+ import { ok } from "./ok.js";
3
+ export async function fromPromise(configOrPromise, promise) {
4
+ let config = null;
5
+ if (!promise && configOrPromise instanceof Promise) {
6
+ promise = configOrPromise;
7
+ }
8
+ else if (!(configOrPromise instanceof Promise)) {
9
+ config = configOrPromise;
10
+ }
11
+ try {
12
+ const value = await promise;
13
+ return ok(value);
14
+ }
15
+ catch (error) {
16
+ return err((config?.onError.type ?? null), {
17
+ ...config?.onError.context,
18
+ error: error
19
+ });
20
+ }
21
+ }
22
+ //# sourceMappingURL=promise.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"promise.js","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAC/B,OAAO,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAiB7B,MAAM,CAAC,KAAK,UAAU,WAAW,CAMhC,eAA4E,EAC5E,OAAkB;IAIlB,IAAI,MAAM,GAA4D,IAAI,CAAC;IAC3E,IAAI,CAAC,OAAO,IAAI,eAAe,YAAY,OAAO,EAAE,CAAC;QACpD,OAAO,GAAG,eAAe,CAAC;IAC3B,CAAC;SAAM,IAAI,CAAC,CAAC,eAAe,YAAY,OAAO,CAAC,EAAE,CAAC;QAClD,MAAM,GAAG,eAAe,CAAC;IAC1B,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,KAAK,GAAG,MAAM,OAAQ,CAAC;QAC7B,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAClB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,OAAO,GAAG,CACT,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,IAAI,CAAU,EACvC;YACC,GAAG,MAAM,EAAE,OAAO,CAAC,OAAO;YAC1B,KAAK,EAAE,KAAe;SACU,CACjC,CAAC;IACH,CAAC;AACF,CAAC","sourcesContent":["import { err } from \"./err.js\";\nimport { ok } from \"./ok.js\";\nimport type { ResultErrorDefinition, ReturnResult } from \"./result.types.js\";\n\nexport async function fromPromise<TPromise extends Promise<any>, TError = Error>(\n\tpromise: TPromise\n): Promise<ReturnResult<Awaited<TPromise>, ResultErrorDefinition<null, { error: TError }>>>;\nexport async function fromPromise<\n\tTPromise extends Promise<any>,\n\tconst TType,\n\tTContext extends object,\n\tTError = Error\n>(\n\tconfig: { onError: { type: TType; context?: TContext } },\n\tpromise: TPromise\n): Promise<\n\tReturnResult<Awaited<TPromise>, ResultErrorDefinition<TType, TContext & { error: TError }>>\n>;\nexport async function fromPromise<\n\tTPromise extends Promise<any>,\n\tconst TType,\n\tTContext extends object,\n\tTError = Error\n>(\n\tconfigOrPromise: { onError: { type: TType; context?: TContext } } | TPromise,\n\tpromise?: TPromise\n): Promise<\n\tReturnResult<Awaited<TPromise>, ResultErrorDefinition<TType, TContext & { error: TError }>>\n> {\n\tlet config: { onError: { type: TType; context?: TContext } } | null = null;\n\tif (!promise && configOrPromise instanceof Promise) {\n\t\tpromise = configOrPromise;\n\t} else if (!(configOrPromise instanceof Promise)) {\n\t\tconfig = configOrPromise;\n\t}\n\n\ttry {\n\t\tconst value = await promise!;\n\t\treturn ok(value);\n\t} catch (error) {\n\t\treturn err(\n\t\t\t(config?.onError.type ?? null) as TType,\n\t\t\t{\n\t\t\t\t...config?.onError.context,\n\t\t\t\terror: error as TError\n\t\t\t} as TContext & { error: TError }\n\t\t);\n\t}\n}\n"]}
@@ -0,0 +1,9 @@
1
+ import type { Err } from "./err.js";
2
+ import type { Ok } from "./ok.js";
3
+ export type ResultErrorDefinition<TType, TContext> = {
4
+ type: TType;
5
+ context: TContext;
6
+ };
7
+ export type ReturnResult<TValue, TError extends ResultErrorDefinition<any, any>> = Ok<TValue> | Err<TError["type"], TError["context"]>;
8
+ export type ResultFn<TInput extends any[] = any[], TResult extends ReturnResult<any, any> = ReturnResult<any, any>> = (...args: TInput) => TResult;
9
+ export type ResultAsyncFn<TInput extends any[] = any[], TResult extends Promise<ReturnResult<any, any>> = Promise<ReturnResult<any, any>>> = (...args: TInput) => TResult;
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=result.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result.types.js","sourceRoot":"","sources":["../src/result.types.ts"],"names":[],"mappings":"","sourcesContent":["import type { Err } from \"./err.js\";\nimport type { Ok } from \"./ok.js\";\n\nexport type ResultErrorDefinition<TType, TContext> = {\n\ttype: TType;\n\tcontext: TContext;\n};\n\nexport type ReturnResult<TValue, TError extends ResultErrorDefinition<any, any>> =\n\t| Ok<TValue>\n\t| Err<TError[\"type\"], TError[\"context\"]>;\n\nexport type ResultFn<\n\tTInput extends any[] = any[],\n\tTResult extends ReturnResult<any, any> = ReturnResult<any, any>\n> = (...args: TInput) => TResult;\n\nexport type ResultAsyncFn<\n\tTInput extends any[] = any[],\n\tTResult extends Promise<ReturnResult<any, any>> = Promise<ReturnResult<any, any>>\n> = (...args: TInput) => TResult;\n"]}
package/build/zod.d.ts ADDED
@@ -0,0 +1,46 @@
1
+ import { z } from "zod";
2
+ export declare const OkSchema: z.ZodObject<{
3
+ ok: z.ZodLiteral<true>;
4
+ value: z.ZodAny;
5
+ }, "strip", z.ZodTypeAny, {
6
+ ok: true;
7
+ value?: any;
8
+ }, {
9
+ ok: true;
10
+ value?: any;
11
+ }>;
12
+ export declare const ErrSchema: z.ZodObject<{
13
+ ok: z.ZodLiteral<false>;
14
+ type: z.ZodAny;
15
+ context: z.ZodAny;
16
+ }, "strip", z.ZodTypeAny, {
17
+ ok: false;
18
+ type?: any;
19
+ context?: any;
20
+ }, {
21
+ ok: false;
22
+ type?: any;
23
+ context?: any;
24
+ }>;
25
+ export declare const ReturnResultSchema: z.ZodUnion<[z.ZodObject<{
26
+ ok: z.ZodLiteral<true>;
27
+ value: z.ZodAny;
28
+ }, "strip", z.ZodTypeAny, {
29
+ ok: true;
30
+ value?: any;
31
+ }, {
32
+ ok: true;
33
+ value?: any;
34
+ }>, z.ZodObject<{
35
+ ok: z.ZodLiteral<false>;
36
+ type: z.ZodAny;
37
+ context: z.ZodAny;
38
+ }, "strip", z.ZodTypeAny, {
39
+ ok: false;
40
+ type?: any;
41
+ context?: any;
42
+ }, {
43
+ ok: false;
44
+ type?: any;
45
+ context?: any;
46
+ }>]>;
package/build/zod.js ADDED
@@ -0,0 +1,12 @@
1
+ import { z } from "zod";
2
+ export const OkSchema = z.object({
3
+ ok: z.literal(true),
4
+ value: z.any()
5
+ });
6
+ export const ErrSchema = z.object({
7
+ ok: z.literal(false),
8
+ type: z.any(),
9
+ context: z.any()
10
+ });
11
+ export const ReturnResultSchema = z.union([OkSchema, ErrSchema]);
12
+ //# sourceMappingURL=zod.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.js","sourceRoot":"","sources":["../src/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAmB,MAAM,KAAK,CAAC;AAKzC,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,CAAC,MAAM,CAAC;IAChC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;IACnB,KAAK,EAAE,CAAC,CAAC,GAAG,EAAE;CAC8B,CAAC,CAAC;AAE/C,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC,GAAG,EAAE;IACb,OAAO,EAAE,CAAC,CAAC,GAAG,EAAE;CACkC,CAAC,CAAC;AAErD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC","sourcesContent":["import { z, type ZodTypeAny } from \"zod\";\n\nimport type { Err } from \"./err.js\";\nimport type { Ok } from \"./ok.js\";\n\nexport const OkSchema = z.object({\n\tok: z.literal(true),\n\tvalue: z.any()\n} satisfies Record<keyof Ok<any>, ZodTypeAny>);\n\nexport const ErrSchema = z.object({\n\tok: z.literal(false),\n\ttype: z.any(),\n\tcontext: z.any()\n} satisfies Record<keyof Err<any, any>, ZodTypeAny>);\n\nexport const ReturnResultSchema = z.union([OkSchema, ErrSchema]);\n"]}
package/package.json ADDED
@@ -0,0 +1,30 @@
1
+ {
2
+ "name": "@l3dev/result",
3
+ "version": "0.2.1",
4
+ "description": "Type-safe result-based error handling",
5
+ "type": "module",
6
+ "main": "./build/index.js",
7
+ "types": "./build/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./build/index.d.ts",
11
+ "import": "./build/index.js"
12
+ },
13
+ "./zod": {
14
+ "types": "./build/zod.d.ts",
15
+ "import": "./build/zod.js"
16
+ }
17
+ },
18
+ "files": [
19
+ "build"
20
+ ],
21
+ "author": "l3dotdev",
22
+ "license": "MIT",
23
+ "dependencies": {
24
+ "zod": "^3.25.56"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc -p tsconfig.json",
28
+ "package": "pnpm build"
29
+ }
30
+ }