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 +53 -3
- package/dist/index.cjs +50 -22
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -13
- package/dist/index.d.ts +19 -13
- package/dist/index.js +48 -22
- package/dist/index.js.map +1 -1
- package/package.json +5 -4
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
|
|
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
|
|
20
|
+
import { success, fail, type Result } from 'generic-result-type';
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
CommonJS:
|
|
24
24
|
|
|
25
25
|
```js
|
|
26
|
-
const {
|
|
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
|
-
|
|
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
|
-
|
|
51
|
-
return new
|
|
62
|
+
async mapAsync(mapFunction) {
|
|
63
|
+
return new _SuccessResult(await mapFunction(this.value));
|
|
52
64
|
}
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
return
|
|
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
|
-
|
|
98
|
+
combine,
|
|
99
|
+
fail,
|
|
73
100
|
isErrorResult,
|
|
74
|
-
isSuccessResult
|
|
101
|
+
isSuccessResult,
|
|
102
|
+
success
|
|
75
103
|
});
|
|
76
104
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.mts","../src/errorResult.mts","../src/successResult.mts"
|
|
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:
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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,
|
|
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:
|
|
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
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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,
|
|
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
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
return
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
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/
|
|
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
|
|
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
|
|
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
|
+
}
|