generic-result-type 1.0.0 → 2.1.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/README.md CHANGED
@@ -12,18 +12,18 @@ npm i generic-result-type
12
12
 
13
13
  ## Module support
14
14
 
15
- This package supports *both ESM and CommonJS* out of the box.
15
+ This package supports **both ESM and CommonJS** out of the box.
16
16
 
17
17
  ESM:
18
18
 
19
19
  ```ts
20
- import { Result } from "generic-result-type"
20
+ import { success, fail, type Result } from 'generic-result-type';
21
21
  ```
22
22
 
23
23
  CommonJS:
24
24
 
25
25
  ```js
26
- const { Result } = require("generic-result-type");
26
+ const { success, fail } = require('generic-result-type');
27
27
  ```
28
28
 
29
29
  TypeScript typings are included.
@@ -33,6 +33,56 @@ TypeScript typings are included.
33
33
  This package has zero runtime dependencies.
34
34
  It does not rely on any external libraries.
35
35
 
36
+ ## Usage
37
+
38
+ Create results using the `success` and `fail` functions, then narrow them with the provided type guards.
39
+
40
+ ### Example function
41
+
42
+ ```ts
43
+ const parseNumber = (input: string): Result<number> => {
44
+ const value = Number(input);
45
+
46
+ if (Number.isNaN(value)) {
47
+ return fail(Error('Not a number'));
48
+ }
49
+
50
+ return success(value);
51
+ }
52
+ ```
53
+
54
+ ### Handling results
55
+
56
+ Use the type guard helpers to safely branch on the result type.
57
+
58
+ ```ts
59
+ const result = getSomeValue();
60
+
61
+ if (isErrorResult(result)) { // or if (result.success === false)
62
+ console.error('Error:', result.error.message);
63
+ return;
64
+ }
65
+
66
+ console.log('Value:', result.value);
67
+ ```
68
+
69
+ TypeScript will correctly narrow the type inside each branch without casting.
70
+
71
+ ### Mapping
72
+
73
+ You can map the value or the error of a Result with these methods:
74
+
75
+ * map
76
+ * mapErr
77
+ * mapAsync
78
+ * mapErrAsync
79
+
80
+ ```ts
81
+ const numberResult = getSomeNumberResult().map(x => x * 2);
82
+
83
+ const responseResult = await getSomeStringResult().mapAsync(async x => fetch(x));
84
+ ```
85
+
36
86
  ## License
37
87
 
38
88
  ISC
package/dist/index.cjs CHANGED
@@ -20,57 +20,85 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
20
20
  // src/index.mts
21
21
  var index_exports = {};
22
22
  __export(index_exports, {
23
- Result: () => Result,
23
+ combine: () => combine,
24
+ fail: () => fail,
24
25
  isErrorResult: () => isErrorResult,
25
- isSuccessResult: () => isSuccessResult
26
+ isSuccessResult: () => isSuccessResult,
27
+ success: () => success
26
28
  });
27
29
  module.exports = __toCommonJS(index_exports);
28
30
 
29
31
  // src/errorResult.mts
30
- var ErrorResult = class {
32
+ var ErrorResult = class _ErrorResult {
31
33
  constructor(error) {
32
34
  this.error = error;
33
35
  this.success = false;
34
36
  }
37
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters
38
+ map(mapFunction) {
39
+ return this;
40
+ }
41
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
42
+ async mapAsync(mapFunction) {
43
+ return this;
44
+ }
45
+ mapErr(mapFunction) {
46
+ return new _ErrorResult(mapFunction(this.error));
47
+ }
48
+ async mapErrAsync(mapFunction) {
49
+ return new _ErrorResult(await mapFunction(this.error));
50
+ }
35
51
  };
36
52
 
37
53
  // src/successResult.mts
38
- var SuccessResult = class {
54
+ var SuccessResult = class _SuccessResult {
39
55
  constructor(value) {
40
- this.value = value;
41
56
  this.success = true;
57
+ this.value = value;
42
58
  }
43
- };
44
-
45
- // src/result.mts
46
- var Result = class _Result {
47
- static success(value) {
48
- return new SuccessResult(value);
59
+ map(mapFunction) {
60
+ return new _SuccessResult(mapFunction(this.value));
49
61
  }
50
- static fail(error) {
51
- return new ErrorResult(error);
62
+ async mapAsync(mapFunction) {
63
+ return new _SuccessResult(await mapFunction(this.value));
52
64
  }
53
- static combine(results) {
54
- for (const result of results) {
55
- if (!result.success) {
56
- return result;
57
- }
58
- }
59
- return _Result.success(void 0);
65
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters
66
+ mapErr(mapFunction) {
67
+ return this;
68
+ }
69
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
70
+ async mapErrAsync(mapFunction) {
71
+ return this;
60
72
  }
61
73
  };
62
74
 
63
75
  // src/index.mts
76
+ function success(value) {
77
+ return new SuccessResult(value);
78
+ }
79
+ function fail(error) {
80
+ return new ErrorResult(error);
81
+ }
64
82
  var isSuccessResult = (result) => {
65
83
  return result.success;
66
84
  };
67
85
  var isErrorResult = (result) => {
68
86
  return !result.success;
69
87
  };
88
+ function combine(...results) {
89
+ for (const r of results) {
90
+ if (!r.success) {
91
+ return r;
92
+ }
93
+ }
94
+ return new SuccessResult(void 0);
95
+ }
70
96
  // Annotate the CommonJS export names for ESM import in node:
71
97
  0 && (module.exports = {
72
- Result,
98
+ combine,
99
+ fail,
73
100
  isErrorResult,
74
- isSuccessResult
101
+ isSuccessResult,
102
+ success
75
103
  });
76
104
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.mts","../src/errorResult.mts","../src/successResult.mts","../src/result.mts"],"sourcesContent":["import type { IErrorResult } from './errorResult.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\n\nexport { Result } from './result.mjs';\nexport type { ISuccessResult };\nexport type { IErrorResult };\n\nexport type ResultType<T> = ISuccessResult<T> | IErrorResult;\n\n// eslint-disable-next-line @stylistic/comma-dangle\nexport const isSuccessResult = <T,>(result: ResultType<T>): result is ISuccessResult<T> => {\n return result.success;\n};\n\n// eslint-disable-next-line @stylistic/comma-dangle\nexport const isErrorResult = <T,>(result: ResultType<T>): result is IErrorResult => {\n return !result.success;\n};\n","export interface IErrorResult {\n readonly success: false;\n readonly error: Error;\n}\n\nexport class ErrorResult implements IErrorResult {\n public readonly success = false as const;\n\n public constructor(public readonly error: Error) { /* empty */ }\n}\n","export interface ISuccessResult<T> {\n readonly success: true;\n readonly value: T;\n}\n\nexport class SuccessResult<T> implements ISuccessResult<T> {\n public readonly success = true as const;\n\n public constructor(public readonly value: T) { /* empty */ }\n}\n","import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { ResultType } from './index.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport abstract class Result {\n\n public static success<T>(value: T): ISuccessResult<T> {\n return new SuccessResult(value);\n }\n\n public static fail(error: Error): IErrorResult {\n return new ErrorResult(error);\n }\n\n public static combine<T>(results: ResultType<T>[]): ResultType<T | undefined> {\n for (const result of results) {\n if (!result.success) {\n return result;\n }\n }\n return Result.success<undefined>(undefined);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACKO,IAAM,cAAN,MAA0C;AAAA,EAGxC,YAA4B,OAAc;AAAd;AAFnC,SAAgB,UAAU;AAAA,EAEqC;AACjE;;;ACJO,IAAM,gBAAN,MAAoD;AAAA,EAGlD,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAC7D;;;ACFO,IAAe,SAAf,MAAe,QAAO;AAAA,EAE3B,OAAc,QAAW,OAA6B;AACpD,WAAO,IAAI,cAAc,KAAK;AAAA,EAChC;AAAA,EAEA,OAAc,KAAK,OAA4B;AAC7C,WAAO,IAAI,YAAY,KAAK;AAAA,EAC9B;AAAA,EAEA,OAAc,QAAW,SAAqD;AAC5E,eAAW,UAAU,SAAS;AAC5B,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,QAAO,QAAmB,MAAS;AAAA,EAC5C;AACF;;;AHfO,IAAM,kBAAkB,CAAK,WAAuD;AACzF,SAAO,OAAO;AAChB;AAGO,IAAM,gBAAgB,CAAK,WAAkD;AAClF,SAAO,CAAC,OAAO;AACjB;","names":[]}
1
+ {"version":3,"sources":["../src/index.mts","../src/errorResult.mts","../src/successResult.mts"],"sourcesContent":["import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { ISuccessResult };\nexport type { IErrorResult };\n\nexport type Result<T = void, E = Error> = ISuccessResult<T> | IErrorResult<E>;\n\nexport function success(): ISuccessResult;\nexport function success<T>(value: T): ISuccessResult<T>;\nexport function success<T>(value?: T): ISuccessResult<T> {\n return new SuccessResult(value as T);\n};\n\nexport function fail<E>(error: E): IErrorResult<E> {\n return new ErrorResult(error);\n}\n\nexport const isSuccessResult = <T, E = Error>(result: Result<T, E>): result is ISuccessResult<T> => {\n return result.success;\n};\n\nexport const isErrorResult = <T, E = Error>(result: Result<T, E>): result is IErrorResult<E> => {\n return !result.success;\n};\n\nexport function combine(...results: Result[]): Result {\n for (const r of results) {\n if (!r.success) {\n return r;\n }\n }\n return new SuccessResult(undefined);\n}\n","export interface IErrorResult<E = Error> {\n readonly success: false;\n readonly error: E;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n readonly mapErr: <M>(mapFunction: (value: E) => M) => IErrorResult<M>;\n readonly mapErrAsync: <M>(mapFunction: (value: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IErrorResult<E> {\n public readonly success = false as const;\n\n public constructor(public readonly error: E) { /* empty */ }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public map<M>(mapFunction: (error: never) => M): this {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await\n public async mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<this> {\n return this;\n }\n\n public mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M> {\n return new ErrorResult(mapFunction(this.error));\n }\n\n public async mapErrAsync<M>(mapFunction: (value: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","export interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (value: never) => M) => ISuccessResult<T>;\n readonly mapErrAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements ISuccessResult<T> {\n public readonly success = true as const;\n public readonly value: T;\n\n public constructor(value?: T) {\n this.value = value as T;\n }\n\n public map<M>(mapFunction: (value: T) => M): SuccessResult<M> {\n return new SuccessResult(mapFunction(this.value));\n }\n\n public async mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>> {\n return new SuccessResult(await mapFunction(this.value));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public mapErr<M>(mapFunction: (error: never) => M): this {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await\n public async mapErrAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<this> {\n return this;\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACUO,IAAM,cAAN,MAAM,aAA0C;AAAA,EAG9C,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAAA;AAAA,EAGpD,IAAO,aAAwC;AACpD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,SAAY,aAA0D;AACjF,WAAO;AAAA,EACT;AAAA,EAEO,OAAU,aAA8C;AAC7D,WAAO,IAAI,aAAY,YAAY,KAAK,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,MAAa,YAAe,aAAgE;AAC1F,WAAO,IAAI,aAAY,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtBO,IAAM,gBAAN,MAAM,eAAqD;AAAA,EAIzD,YAAY,OAAW;AAH9B,SAAgB,UAAU;AAIxB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,IAAO,aAAgD;AAC5D,WAAO,IAAI,eAAc,YAAY,KAAK,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,MAAa,SAAY,aAAkE;AACzF,WAAO,IAAI,eAAc,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA;AAAA,EAGO,OAAU,aAAwC;AACvD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,YAAe,aAA0D;AACpF,WAAO;AAAA,EACT;AACF;;;AFvBO,SAAS,QAAW,OAA8B;AACvD,SAAO,IAAI,cAAc,KAAU;AACrC;AAEO,SAAS,KAAQ,OAA2B;AACjD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAEO,IAAM,kBAAkB,CAAe,WAAsD;AAClG,SAAO,OAAO;AAChB;AAEO,IAAM,gBAAgB,CAAe,WAAoD;AAC9F,SAAO,CAAC,OAAO;AACjB;AAEO,SAAS,WAAW,SAA2B;AACpD,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,EAAE,SAAS;AACd,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,IAAI,cAAc,MAAS;AACpC;","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,21 +1,27 @@
1
- interface IErrorResult {
1
+ interface IErrorResult<E = Error> {
2
2
  readonly success: false;
3
- readonly error: Error;
3
+ readonly error: E;
4
+ readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;
5
+ readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;
6
+ readonly mapErr: <M>(mapFunction: (value: E) => M) => IErrorResult<M>;
7
+ readonly mapErrAsync: <M>(mapFunction: (value: E) => Promise<M>) => Promise<IErrorResult<M>>;
4
8
  }
5
9
 
6
- interface ISuccessResult<T> {
10
+ interface ISuccessResult<T = void> {
7
11
  readonly success: true;
8
12
  readonly value: T;
13
+ readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;
14
+ readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;
15
+ readonly mapErr: <M>(mapFunction: (value: never) => M) => ISuccessResult<T>;
16
+ readonly mapErrAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<ISuccessResult<T>>;
9
17
  }
10
18
 
11
- declare abstract class Result {
12
- static success<T>(value: T): ISuccessResult<T>;
13
- static fail(error: Error): IErrorResult;
14
- static combine<T>(results: ResultType<T>[]): ResultType<T | undefined>;
15
- }
16
-
17
- type ResultType<T> = ISuccessResult<T> | IErrorResult;
18
- declare const isSuccessResult: <T>(result: ResultType<T>) => result is ISuccessResult<T>;
19
- declare const isErrorResult: <T>(result: ResultType<T>) => result is IErrorResult;
19
+ type Result<T = void, E = Error> = ISuccessResult<T> | IErrorResult<E>;
20
+ declare function success(): ISuccessResult;
21
+ declare function success<T>(value: T): ISuccessResult<T>;
22
+ declare function fail<E>(error: E): IErrorResult<E>;
23
+ declare const isSuccessResult: <T, E = Error>(result: Result<T, E>) => result is ISuccessResult<T>;
24
+ declare const isErrorResult: <T, E = Error>(result: Result<T, E>) => result is IErrorResult<E>;
25
+ declare function combine(...results: Result[]): Result;
20
26
 
21
- export { type IErrorResult, type ISuccessResult, Result, type ResultType, isErrorResult, isSuccessResult };
27
+ export { type IErrorResult, type ISuccessResult, type Result, combine, fail, isErrorResult, isSuccessResult, success };
package/dist/index.d.ts CHANGED
@@ -1,21 +1,27 @@
1
- interface IErrorResult {
1
+ interface IErrorResult<E = Error> {
2
2
  readonly success: false;
3
- readonly error: Error;
3
+ readonly error: E;
4
+ readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;
5
+ readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;
6
+ readonly mapErr: <M>(mapFunction: (value: E) => M) => IErrorResult<M>;
7
+ readonly mapErrAsync: <M>(mapFunction: (value: E) => Promise<M>) => Promise<IErrorResult<M>>;
4
8
  }
5
9
 
6
- interface ISuccessResult<T> {
10
+ interface ISuccessResult<T = void> {
7
11
  readonly success: true;
8
12
  readonly value: T;
13
+ readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;
14
+ readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;
15
+ readonly mapErr: <M>(mapFunction: (value: never) => M) => ISuccessResult<T>;
16
+ readonly mapErrAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<ISuccessResult<T>>;
9
17
  }
10
18
 
11
- declare abstract class Result {
12
- static success<T>(value: T): ISuccessResult<T>;
13
- static fail(error: Error): IErrorResult;
14
- static combine<T>(results: ResultType<T>[]): ResultType<T | undefined>;
15
- }
16
-
17
- type ResultType<T> = ISuccessResult<T> | IErrorResult;
18
- declare const isSuccessResult: <T>(result: ResultType<T>) => result is ISuccessResult<T>;
19
- declare const isErrorResult: <T>(result: ResultType<T>) => result is IErrorResult;
19
+ type Result<T = void, E = Error> = ISuccessResult<T> | IErrorResult<E>;
20
+ declare function success(): ISuccessResult;
21
+ declare function success<T>(value: T): ISuccessResult<T>;
22
+ declare function fail<E>(error: E): IErrorResult<E>;
23
+ declare const isSuccessResult: <T, E = Error>(result: Result<T, E>) => result is ISuccessResult<T>;
24
+ declare const isErrorResult: <T, E = Error>(result: Result<T, E>) => result is IErrorResult<E>;
25
+ declare function combine(...results: Result[]): Result;
20
26
 
21
- export { type IErrorResult, type ISuccessResult, Result, type ResultType, isErrorResult, isSuccessResult };
27
+ export { type IErrorResult, type ISuccessResult, type Result, combine, fail, isErrorResult, isSuccessResult, success };
package/dist/index.js CHANGED
@@ -1,47 +1,73 @@
1
1
  // src/errorResult.mts
2
- var ErrorResult = class {
2
+ var ErrorResult = class _ErrorResult {
3
3
  constructor(error) {
4
4
  this.error = error;
5
5
  this.success = false;
6
6
  }
7
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters
8
+ map(mapFunction) {
9
+ return this;
10
+ }
11
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
12
+ async mapAsync(mapFunction) {
13
+ return this;
14
+ }
15
+ mapErr(mapFunction) {
16
+ return new _ErrorResult(mapFunction(this.error));
17
+ }
18
+ async mapErrAsync(mapFunction) {
19
+ return new _ErrorResult(await mapFunction(this.error));
20
+ }
7
21
  };
8
22
 
9
23
  // src/successResult.mts
10
- var SuccessResult = class {
24
+ var SuccessResult = class _SuccessResult {
11
25
  constructor(value) {
12
- this.value = value;
13
26
  this.success = true;
27
+ this.value = value;
14
28
  }
15
- };
16
-
17
- // src/result.mts
18
- var Result = class _Result {
19
- static success(value) {
20
- return new SuccessResult(value);
21
- }
22
- static fail(error) {
23
- return new ErrorResult(error);
24
- }
25
- static combine(results) {
26
- for (const result of results) {
27
- if (!result.success) {
28
- return result;
29
- }
30
- }
31
- return _Result.success(void 0);
29
+ map(mapFunction) {
30
+ return new _SuccessResult(mapFunction(this.value));
31
+ }
32
+ async mapAsync(mapFunction) {
33
+ return new _SuccessResult(await mapFunction(this.value));
34
+ }
35
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters
36
+ mapErr(mapFunction) {
37
+ return this;
38
+ }
39
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await
40
+ async mapErrAsync(mapFunction) {
41
+ return this;
32
42
  }
33
43
  };
34
44
 
35
45
  // src/index.mts
46
+ function success(value) {
47
+ return new SuccessResult(value);
48
+ }
49
+ function fail(error) {
50
+ return new ErrorResult(error);
51
+ }
36
52
  var isSuccessResult = (result) => {
37
53
  return result.success;
38
54
  };
39
55
  var isErrorResult = (result) => {
40
56
  return !result.success;
41
57
  };
58
+ function combine(...results) {
59
+ for (const r of results) {
60
+ if (!r.success) {
61
+ return r;
62
+ }
63
+ }
64
+ return new SuccessResult(void 0);
65
+ }
42
66
  export {
43
- Result,
67
+ combine,
68
+ fail,
44
69
  isErrorResult,
45
- isSuccessResult
70
+ isSuccessResult,
71
+ success
46
72
  };
47
73
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/errorResult.mts","../src/successResult.mts","../src/result.mts","../src/index.mts"],"sourcesContent":["export interface IErrorResult {\n readonly success: false;\n readonly error: Error;\n}\n\nexport class ErrorResult implements IErrorResult {\n public readonly success = false as const;\n\n public constructor(public readonly error: Error) { /* empty */ }\n}\n","export interface ISuccessResult<T> {\n readonly success: true;\n readonly value: T;\n}\n\nexport class SuccessResult<T> implements ISuccessResult<T> {\n public readonly success = true as const;\n\n public constructor(public readonly value: T) { /* empty */ }\n}\n","import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { ResultType } from './index.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\n// eslint-disable-next-line @typescript-eslint/no-extraneous-class\nexport abstract class Result {\n\n public static success<T>(value: T): ISuccessResult<T> {\n return new SuccessResult(value);\n }\n\n public static fail(error: Error): IErrorResult {\n return new ErrorResult(error);\n }\n\n public static combine<T>(results: ResultType<T>[]): ResultType<T | undefined> {\n for (const result of results) {\n if (!result.success) {\n return result;\n }\n }\n return Result.success<undefined>(undefined);\n }\n}\n","import type { IErrorResult } from './errorResult.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\n\nexport { Result } from './result.mjs';\nexport type { ISuccessResult };\nexport type { IErrorResult };\n\nexport type ResultType<T> = ISuccessResult<T> | IErrorResult;\n\n// eslint-disable-next-line @stylistic/comma-dangle\nexport const isSuccessResult = <T,>(result: ResultType<T>): result is ISuccessResult<T> => {\n return result.success;\n};\n\n// eslint-disable-next-line @stylistic/comma-dangle\nexport const isErrorResult = <T,>(result: ResultType<T>): result is IErrorResult => {\n return !result.success;\n};\n"],"mappings":";AAKO,IAAM,cAAN,MAA0C;AAAA,EAGxC,YAA4B,OAAc;AAAd;AAFnC,SAAgB,UAAU;AAAA,EAEqC;AACjE;;;ACJO,IAAM,gBAAN,MAAoD;AAAA,EAGlD,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAC7D;;;ACFO,IAAe,SAAf,MAAe,QAAO;AAAA,EAE3B,OAAc,QAAW,OAA6B;AACpD,WAAO,IAAI,cAAc,KAAK;AAAA,EAChC;AAAA,EAEA,OAAc,KAAK,OAA4B;AAC7C,WAAO,IAAI,YAAY,KAAK;AAAA,EAC9B;AAAA,EAEA,OAAc,QAAW,SAAqD;AAC5E,eAAW,UAAU,SAAS;AAC5B,UAAI,CAAC,OAAO,SAAS;AACnB,eAAO;AAAA,MACT;AAAA,IACF;AACA,WAAO,QAAO,QAAmB,MAAS;AAAA,EAC5C;AACF;;;ACfO,IAAM,kBAAkB,CAAK,WAAuD;AACzF,SAAO,OAAO;AAChB;AAGO,IAAM,gBAAgB,CAAK,WAAkD;AAClF,SAAO,CAAC,OAAO;AACjB;","names":[]}
1
+ {"version":3,"sources":["../src/errorResult.mts","../src/successResult.mts","../src/index.mts"],"sourcesContent":["export interface IErrorResult<E = Error> {\n readonly success: false;\n readonly error: E;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n readonly mapErr: <M>(mapFunction: (value: E) => M) => IErrorResult<M>;\n readonly mapErrAsync: <M>(mapFunction: (value: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IErrorResult<E> {\n public readonly success = false as const;\n\n public constructor(public readonly error: E) { /* empty */ }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public map<M>(mapFunction: (error: never) => M): this {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await\n public async mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<this> {\n return this;\n }\n\n public mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M> {\n return new ErrorResult(mapFunction(this.error));\n }\n\n public async mapErrAsync<M>(mapFunction: (value: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","export interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (value: never) => M) => ISuccessResult<T>;\n readonly mapErrAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements ISuccessResult<T> {\n public readonly success = true as const;\n public readonly value: T;\n\n public constructor(value?: T) {\n this.value = value as T;\n }\n\n public map<M>(mapFunction: (value: T) => M): SuccessResult<M> {\n return new SuccessResult(mapFunction(this.value));\n }\n\n public async mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>> {\n return new SuccessResult(await mapFunction(this.value));\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/no-unnecessary-type-parameters\n public mapErr<M>(mapFunction: (error: never) => M): this {\n return this;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/require-await\n public async mapErrAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<this> {\n return this;\n }\n};\n","import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { ISuccessResult };\nexport type { IErrorResult };\n\nexport type Result<T = void, E = Error> = ISuccessResult<T> | IErrorResult<E>;\n\nexport function success(): ISuccessResult;\nexport function success<T>(value: T): ISuccessResult<T>;\nexport function success<T>(value?: T): ISuccessResult<T> {\n return new SuccessResult(value as T);\n};\n\nexport function fail<E>(error: E): IErrorResult<E> {\n return new ErrorResult(error);\n}\n\nexport const isSuccessResult = <T, E = Error>(result: Result<T, E>): result is ISuccessResult<T> => {\n return result.success;\n};\n\nexport const isErrorResult = <T, E = Error>(result: Result<T, E>): result is IErrorResult<E> => {\n return !result.success;\n};\n\nexport function combine(...results: Result[]): Result {\n for (const r of results) {\n if (!r.success) {\n return r;\n }\n }\n return new SuccessResult(undefined);\n}\n"],"mappings":";AAUO,IAAM,cAAN,MAAM,aAA0C;AAAA,EAG9C,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAAA;AAAA,EAGpD,IAAO,aAAwC;AACpD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,SAAY,aAA0D;AACjF,WAAO;AAAA,EACT;AAAA,EAEO,OAAU,aAA8C;AAC7D,WAAO,IAAI,aAAY,YAAY,KAAK,KAAK,CAAC;AAAA,EAChD;AAAA,EAEA,MAAa,YAAe,aAAgE;AAC1F,WAAO,IAAI,aAAY,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtBO,IAAM,gBAAN,MAAM,eAAqD;AAAA,EAIzD,YAAY,OAAW;AAH9B,SAAgB,UAAU;AAIxB,SAAK,QAAQ;AAAA,EACf;AAAA,EAEO,IAAO,aAAgD;AAC5D,WAAO,IAAI,eAAc,YAAY,KAAK,KAAK,CAAC;AAAA,EAClD;AAAA,EAEA,MAAa,SAAY,aAAkE;AACzF,WAAO,IAAI,eAAc,MAAM,YAAY,KAAK,KAAK,CAAC;AAAA,EACxD;AAAA;AAAA,EAGO,OAAU,aAAwC;AACvD,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,MAAa,YAAe,aAA0D;AACpF,WAAO;AAAA,EACT;AACF;;;ACvBO,SAAS,QAAW,OAA8B;AACvD,SAAO,IAAI,cAAc,KAAU;AACrC;AAEO,SAAS,KAAQ,OAA2B;AACjD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAEO,IAAM,kBAAkB,CAAe,WAAsD;AAClG,SAAO,OAAO;AAChB;AAEO,IAAM,gBAAgB,CAAe,WAAoD;AAC9F,SAAO,CAAC,OAAO;AACjB;AAEO,SAAS,WAAW,SAA2B;AACpD,aAAW,KAAK,SAAS;AACvB,QAAI,CAAC,EAAE,SAAS;AACd,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO,IAAI,cAAc,MAAS;AACpC;","names":[]}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "generic-result-type",
3
- "version": "1.0.0",
3
+ "version": "2.1.0",
4
4
  "description": "A generic result wrapper",
5
5
  "license": "ISC",
6
6
  "author": "Dave Welsh",
7
7
  "repository": {
8
8
  "type": "git",
9
- "url": "https://github.com/move-zig/generic-result-type.git"
9
+ "url": "git+https://github.com/move-zig/generic-result-type.git"
10
10
  },
11
11
  "type": "module",
12
12
  "main": "./dist/index.cjs",
@@ -31,7 +31,7 @@
31
31
  "typecheck": "tsc -p tsconfig.build.json --noEmit",
32
32
  "test": "jest --verbose",
33
33
  "test:watch": "jest --verbose --watch",
34
- "lint": "eslint src"
34
+ "lint": "eslint"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@eslint/compat": "^2.0.0",
@@ -48,9 +48,10 @@
48
48
  "eslint-plugin-jest": "^29.12.1",
49
49
  "jest": "^30.2.0",
50
50
  "jiti": "^2.6.1",
51
+ "ts-node": "^10.9.2",
51
52
  "tsup": "^8.5.1",
52
53
  "tsx": "^4.21.0",
53
54
  "typescript": "^5.9.3",
54
55
  "typescript-eslint": "^8.52.0"
55
56
  }
56
- }
57
+ }