generic-result-type 2.2.3 → 2.3.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 +4 -4
- package/dist/index.cjs +5 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +10 -24
- package/dist/index.d.ts +10 -24
- package/dist/index.js +4 -2
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -17,13 +17,13 @@ This package supports **both ESM and CommonJS** out of the box.
|
|
|
17
17
|
ESM:
|
|
18
18
|
|
|
19
19
|
```ts
|
|
20
|
-
import { success,
|
|
20
|
+
import { success, failure, type Result } from 'generic-result-type';
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
CommonJS:
|
|
24
24
|
|
|
25
25
|
```js
|
|
26
|
-
const { success,
|
|
26
|
+
const { success, failure } = require('generic-result-type');
|
|
27
27
|
```
|
|
28
28
|
|
|
29
29
|
TypeScript typings are included.
|
|
@@ -35,7 +35,7 @@ It does not rely on any external libraries.
|
|
|
35
35
|
|
|
36
36
|
## Usage
|
|
37
37
|
|
|
38
|
-
Create results using the `success` and `
|
|
38
|
+
Create results using the `success` and `failure` functions, then narrow them with the provided type guards.
|
|
39
39
|
|
|
40
40
|
### Example function
|
|
41
41
|
|
|
@@ -44,7 +44,7 @@ const parseNumber = (input: string): Result<number> => {
|
|
|
44
44
|
const value = Number(input);
|
|
45
45
|
|
|
46
46
|
if (Number.isNaN(value)) {
|
|
47
|
-
return
|
|
47
|
+
return failure(Error('Not a number'));
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
return success(value);
|
package/dist/index.cjs
CHANGED
|
@@ -22,6 +22,7 @@ var index_exports = {};
|
|
|
22
22
|
__export(index_exports, {
|
|
23
23
|
combine: () => combine,
|
|
24
24
|
fail: () => fail,
|
|
25
|
+
failure: () => failure,
|
|
25
26
|
flatten: () => flatten,
|
|
26
27
|
isErrorResult: () => isErrorResult,
|
|
27
28
|
isSuccessResult: () => isSuccessResult,
|
|
@@ -77,9 +78,10 @@ var SuccessResult = class _SuccessResult {
|
|
|
77
78
|
function success(value) {
|
|
78
79
|
return new SuccessResult(value);
|
|
79
80
|
}
|
|
80
|
-
function
|
|
81
|
+
function failure(error) {
|
|
81
82
|
return new ErrorResult(error);
|
|
82
83
|
}
|
|
84
|
+
var fail = failure;
|
|
83
85
|
var isSuccessResult = (result) => {
|
|
84
86
|
return result.success;
|
|
85
87
|
};
|
|
@@ -120,7 +122,7 @@ var getError = (result) => {
|
|
|
120
122
|
if (result.error instanceof SuccessResult) {
|
|
121
123
|
const value = getValue(result.error);
|
|
122
124
|
if (isSuccessResult(value)) {
|
|
123
|
-
return
|
|
125
|
+
return failure(value);
|
|
124
126
|
}
|
|
125
127
|
return value;
|
|
126
128
|
}
|
|
@@ -133,6 +135,7 @@ var getError = (result) => {
|
|
|
133
135
|
0 && (module.exports = {
|
|
134
136
|
combine,
|
|
135
137
|
fail,
|
|
138
|
+
failure,
|
|
136
139
|
flatten,
|
|
137
140
|
isErrorResult,
|
|
138
141
|
isSuccessResult,
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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 { Result } from './result.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { Result, ISuccessResult, IErrorResult };\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
|
|
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 { IResult, Result } from './result.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { Result, ISuccessResult, IErrorResult };\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 failure<E>(error: E): IErrorResult<E> {\n return new ErrorResult(error);\n}\n\n/**\n * @deprecated\n */\nexport const fail = failure;\n\nexport const isSuccessResult = <T, E = Error>(result: IResult<T, E>): result is ISuccessResult<T> => {\n return result.success;\n};\n\nexport const isErrorResult = <T, E = Error>(result: IResult<T, E>): result is IErrorResult<E> => {\n return !result.success;\n};\n\nexport function combine(results: Result<unknown, unknown>[]): Result<unknown[], unknown[]> {\n const values: unknown[] = [];\n const errors: unknown[] = [];\n\n for (const r of results) {\n if (r.success) {\n values.push(r.value);\n } else {\n errors.push(r.error);\n }\n }\n\n if (errors.length) {\n return new ErrorResult(errors);\n }\n return new SuccessResult(values);\n}\n\nexport const flatten = (result: Result<unknown, unknown>): Result<unknown, unknown> => {\n if (isSuccessResult(result)) {\n return getValue(result);\n }\n return getError(result);\n};\n\nconst getValue = (result: SuccessResult<unknown>): Result<unknown, unknown> => {\n // value is a SuccessResult, drill down\n if (result.value instanceof SuccessResult) {\n return getValue(result.value);\n }\n\n // value is an ErrorResult, drill down\n if (result.value instanceof ErrorResult) {\n return getError(result.value);\n }\n\n // value is not a Result, return current SuccessResult\n return result;\n};\n\nconst getError = (result: ErrorResult<unknown>): ErrorResult<unknown> => {\n // error is a SuccessResult, consider this SuccessResult's value\n if (result.error instanceof SuccessResult) {\n const value = getValue(result.error);\n\n // if the value is a SuccessResult, swallow it into an error\n if (isSuccessResult(value)) {\n return failure(value);\n }\n\n // otherwise the value is an ErrorResult, return it\n return value;\n }\n\n // error is an ErrorResult, swallow it\n if (result.error instanceof ErrorResult) {\n return getError(result.error);\n }\n\n // error is not a Result, the current ErrorResult\n return result;\n};\n","import type { IResult } from './result.mjs';\n\nexport interface IErrorResult<E = Error> extends IResult<never, E> {\n readonly success: false;\n readonly error: E;\n\n /**\n * Returns a new `ErrorResult` with the same `error` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n\n /**\n * Asynchronously returns a new `ErrorResult` with the same `error` property as this one.\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n\n /**\n * Calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErr: <M>(mapFunction: (error: E) => M) => IErrorResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IErrorResult<E>, IResult<never, 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: (value: never) => M): ErrorResult<E> {\n return new ErrorResult(this.error);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>> {\n return Promise.resolve(new ErrorResult(this.error));\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: (error: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","import type { IResult } from './result.mjs';\n\nexport interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n\n /**\n * Calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n\n /**\n * Returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (error: never) => M) => ISuccessResult<T>;\n\n /**\n * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements ISuccessResult<T>, IResult<T, never> {\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): SuccessResult<T> {\n return new SuccessResult(this.value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>> {\n return Promise.resolve(new SuccessResult(this.value));\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACuCO,IAAM,cAAN,MAAM,aAA6D;AAAA,EAGjE,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAAA;AAAA,EAGpD,IAAO,aAAkD;AAC9D,WAAO,IAAI,aAAY,KAAK,KAAK;AAAA,EACnC;AAAA;AAAA,EAGO,SAAY,aAAoE;AACrF,WAAO,QAAQ,QAAQ,IAAI,aAAY,KAAK,KAAK,CAAC;AAAA,EACpD;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,eAAwE;AAAA,EAI5E,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,aAAoD;AACnE,WAAO,IAAI,eAAc,KAAK,KAAK;AAAA,EACrC;AAAA;AAAA,EAGO,YAAe,aAAsE;AAC1F,WAAO,QAAQ,QAAQ,IAAI,eAAc,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;AFtDO,SAAS,QAAW,OAA8B;AACvD,SAAO,IAAI,cAAc,KAAU;AACrC;AAEO,SAAS,QAAW,OAA2B;AACpD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAKO,IAAM,OAAO;AAEb,IAAM,kBAAkB,CAAe,WAAuD;AACnG,SAAO,OAAO;AAChB;AAEO,IAAM,gBAAgB,CAAe,WAAqD;AAC/F,SAAO,CAAC,OAAO;AACjB;AAEO,SAAS,QAAQ,SAAmE;AACzF,QAAM,SAAoB,CAAC;AAC3B,QAAM,SAAoB,CAAC;AAE3B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS;AACb,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB,OAAO;AACL,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ;AACjB,WAAO,IAAI,YAAY,MAAM;AAAA,EAC/B;AACA,SAAO,IAAI,cAAc,MAAM;AACjC;AAEO,IAAM,UAAU,CAAC,WAA+D;AACrF,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,SAAO,SAAS,MAAM;AACxB;AAEA,IAAM,WAAW,CAAC,WAA6D;AAE7E,MAAI,OAAO,iBAAiB,eAAe;AACzC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,WAAuD;AAEvE,MAAI,OAAO,iBAAiB,eAAe;AACzC,UAAM,QAAQ,SAAS,OAAO,KAAK;AAGnC,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO,QAAQ,KAAK;AAAA,IACtB;AAGA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;","names":[]}
|
package/dist/index.d.cts
CHANGED
|
@@ -29,17 +29,8 @@ interface ISuccessResult<T = void> {
|
|
|
29
29
|
*/
|
|
30
30
|
readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;
|
|
31
31
|
}
|
|
32
|
-
declare class SuccessResult<T = void> implements ISuccessResult<T>, IResult<T, never> {
|
|
33
|
-
readonly success: true;
|
|
34
|
-
readonly value: T;
|
|
35
|
-
constructor(value?: T);
|
|
36
|
-
map<M>(mapFunction: (value: T) => M): SuccessResult<M>;
|
|
37
|
-
mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>>;
|
|
38
|
-
mapErr<M>(mapFunction: (error: never) => M): SuccessResult<T>;
|
|
39
|
-
mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>>;
|
|
40
|
-
}
|
|
41
32
|
|
|
42
|
-
interface IResult<T, E> {
|
|
33
|
+
interface IResult<T = void, E = Error> {
|
|
43
34
|
readonly success: boolean;
|
|
44
35
|
/**
|
|
45
36
|
* If a `SuccessResult`, calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.
|
|
@@ -73,7 +64,7 @@ interface IResult<T, E> {
|
|
|
73
64
|
*/
|
|
74
65
|
mapErrAsync: <M>(fn: (error: E) => Promise<M>) => Promise<IResult<T, M>>;
|
|
75
66
|
}
|
|
76
|
-
type Result<T = void, E = Error> =
|
|
67
|
+
type Result<T = void, E = Error> = ISuccessResult<T> | IErrorResult<E>;
|
|
77
68
|
|
|
78
69
|
interface IErrorResult<E = Error> extends IResult<never, E> {
|
|
79
70
|
readonly success: false;
|
|
@@ -106,22 +97,17 @@ interface IErrorResult<E = Error> extends IResult<never, E> {
|
|
|
106
97
|
*/
|
|
107
98
|
readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;
|
|
108
99
|
}
|
|
109
|
-
declare class ErrorResult<E> implements IErrorResult<E>, IResult<never, E> {
|
|
110
|
-
readonly error: E;
|
|
111
|
-
readonly success: false;
|
|
112
|
-
constructor(error: E);
|
|
113
|
-
map<M>(mapFunction: (value: never) => M): ErrorResult<E>;
|
|
114
|
-
mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>>;
|
|
115
|
-
mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M>;
|
|
116
|
-
mapErrAsync<M>(mapFunction: (error: E) => Promise<M>): Promise<ErrorResult<M>>;
|
|
117
|
-
}
|
|
118
100
|
|
|
119
101
|
declare function success(): ISuccessResult;
|
|
120
102
|
declare function success<T>(value: T): ISuccessResult<T>;
|
|
121
|
-
declare function
|
|
122
|
-
|
|
123
|
-
|
|
103
|
+
declare function failure<E>(error: E): IErrorResult<E>;
|
|
104
|
+
/**
|
|
105
|
+
* @deprecated
|
|
106
|
+
*/
|
|
107
|
+
declare const fail: typeof failure;
|
|
108
|
+
declare const isSuccessResult: <T, E = Error>(result: IResult<T, E>) => result is ISuccessResult<T>;
|
|
109
|
+
declare const isErrorResult: <T, E = Error>(result: IResult<T, E>) => result is IErrorResult<E>;
|
|
124
110
|
declare function combine(results: Result<unknown, unknown>[]): Result<unknown[], unknown[]>;
|
|
125
111
|
declare const flatten: (result: Result<unknown, unknown>) => Result<unknown, unknown>;
|
|
126
112
|
|
|
127
|
-
export { type IErrorResult, type ISuccessResult, type Result, combine, fail, flatten, isErrorResult, isSuccessResult, success };
|
|
113
|
+
export { type IErrorResult, type ISuccessResult, type Result, combine, fail, failure, flatten, isErrorResult, isSuccessResult, success };
|
package/dist/index.d.ts
CHANGED
|
@@ -29,17 +29,8 @@ interface ISuccessResult<T = void> {
|
|
|
29
29
|
*/
|
|
30
30
|
readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;
|
|
31
31
|
}
|
|
32
|
-
declare class SuccessResult<T = void> implements ISuccessResult<T>, IResult<T, never> {
|
|
33
|
-
readonly success: true;
|
|
34
|
-
readonly value: T;
|
|
35
|
-
constructor(value?: T);
|
|
36
|
-
map<M>(mapFunction: (value: T) => M): SuccessResult<M>;
|
|
37
|
-
mapAsync<M>(mapFunction: (value: T) => Promise<M>): Promise<SuccessResult<M>>;
|
|
38
|
-
mapErr<M>(mapFunction: (error: never) => M): SuccessResult<T>;
|
|
39
|
-
mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>>;
|
|
40
|
-
}
|
|
41
32
|
|
|
42
|
-
interface IResult<T, E> {
|
|
33
|
+
interface IResult<T = void, E = Error> {
|
|
43
34
|
readonly success: boolean;
|
|
44
35
|
/**
|
|
45
36
|
* If a `SuccessResult`, calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.
|
|
@@ -73,7 +64,7 @@ interface IResult<T, E> {
|
|
|
73
64
|
*/
|
|
74
65
|
mapErrAsync: <M>(fn: (error: E) => Promise<M>) => Promise<IResult<T, M>>;
|
|
75
66
|
}
|
|
76
|
-
type Result<T = void, E = Error> =
|
|
67
|
+
type Result<T = void, E = Error> = ISuccessResult<T> | IErrorResult<E>;
|
|
77
68
|
|
|
78
69
|
interface IErrorResult<E = Error> extends IResult<never, E> {
|
|
79
70
|
readonly success: false;
|
|
@@ -106,22 +97,17 @@ interface IErrorResult<E = Error> extends IResult<never, E> {
|
|
|
106
97
|
*/
|
|
107
98
|
readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;
|
|
108
99
|
}
|
|
109
|
-
declare class ErrorResult<E> implements IErrorResult<E>, IResult<never, E> {
|
|
110
|
-
readonly error: E;
|
|
111
|
-
readonly success: false;
|
|
112
|
-
constructor(error: E);
|
|
113
|
-
map<M>(mapFunction: (value: never) => M): ErrorResult<E>;
|
|
114
|
-
mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>>;
|
|
115
|
-
mapErr<M>(mapFunction: (error: E) => M): ErrorResult<M>;
|
|
116
|
-
mapErrAsync<M>(mapFunction: (error: E) => Promise<M>): Promise<ErrorResult<M>>;
|
|
117
|
-
}
|
|
118
100
|
|
|
119
101
|
declare function success(): ISuccessResult;
|
|
120
102
|
declare function success<T>(value: T): ISuccessResult<T>;
|
|
121
|
-
declare function
|
|
122
|
-
|
|
123
|
-
|
|
103
|
+
declare function failure<E>(error: E): IErrorResult<E>;
|
|
104
|
+
/**
|
|
105
|
+
* @deprecated
|
|
106
|
+
*/
|
|
107
|
+
declare const fail: typeof failure;
|
|
108
|
+
declare const isSuccessResult: <T, E = Error>(result: IResult<T, E>) => result is ISuccessResult<T>;
|
|
109
|
+
declare const isErrorResult: <T, E = Error>(result: IResult<T, E>) => result is IErrorResult<E>;
|
|
124
110
|
declare function combine(results: Result<unknown, unknown>[]): Result<unknown[], unknown[]>;
|
|
125
111
|
declare const flatten: (result: Result<unknown, unknown>) => Result<unknown, unknown>;
|
|
126
112
|
|
|
127
|
-
export { type IErrorResult, type ISuccessResult, type Result, combine, fail, flatten, isErrorResult, isSuccessResult, success };
|
|
113
|
+
export { type IErrorResult, type ISuccessResult, type Result, combine, fail, failure, flatten, isErrorResult, isSuccessResult, success };
|
package/dist/index.js
CHANGED
|
@@ -46,9 +46,10 @@ var SuccessResult = class _SuccessResult {
|
|
|
46
46
|
function success(value) {
|
|
47
47
|
return new SuccessResult(value);
|
|
48
48
|
}
|
|
49
|
-
function
|
|
49
|
+
function failure(error) {
|
|
50
50
|
return new ErrorResult(error);
|
|
51
51
|
}
|
|
52
|
+
var fail = failure;
|
|
52
53
|
var isSuccessResult = (result) => {
|
|
53
54
|
return result.success;
|
|
54
55
|
};
|
|
@@ -89,7 +90,7 @@ var getError = (result) => {
|
|
|
89
90
|
if (result.error instanceof SuccessResult) {
|
|
90
91
|
const value = getValue(result.error);
|
|
91
92
|
if (isSuccessResult(value)) {
|
|
92
|
-
return
|
|
93
|
+
return failure(value);
|
|
93
94
|
}
|
|
94
95
|
return value;
|
|
95
96
|
}
|
|
@@ -101,6 +102,7 @@ var getError = (result) => {
|
|
|
101
102
|
export {
|
|
102
103
|
combine,
|
|
103
104
|
fail,
|
|
105
|
+
failure,
|
|
104
106
|
flatten,
|
|
105
107
|
isErrorResult,
|
|
106
108
|
isSuccessResult,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/errorResult.mts","../src/successResult.mts","../src/index.mts"],"sourcesContent":["import type { IResult } from './result.mjs';\n\nexport interface IErrorResult<E = Error> extends IResult<never, E> {\n readonly success: false;\n readonly error: E;\n\n /**\n * Returns a new `ErrorResult` with the same `error` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n\n /**\n * Asynchronously returns a new `ErrorResult` with the same `error` property as this one.\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n\n /**\n * Calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErr: <M>(mapFunction: (error: E) => M) => IErrorResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IErrorResult<E>, IResult<never, 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: (value: never) => M): ErrorResult<E> {\n return new ErrorResult(this.error);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>> {\n return Promise.resolve(new ErrorResult(this.error));\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: (error: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","import type { IResult } from './result.mjs';\n\nexport interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n\n /**\n * Calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n\n /**\n * Returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (error: never) => M) => ISuccessResult<T>;\n\n /**\n * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements ISuccessResult<T>, IResult<T, never> {\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): SuccessResult<T> {\n return new SuccessResult(this.value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>> {\n return Promise.resolve(new SuccessResult(this.value));\n }\n}
|
|
1
|
+
{"version":3,"sources":["../src/errorResult.mts","../src/successResult.mts","../src/index.mts"],"sourcesContent":["import type { IResult } from './result.mjs';\n\nexport interface IErrorResult<E = Error> extends IResult<never, E> {\n readonly success: false;\n readonly error: E;\n\n /**\n * Returns a new `ErrorResult` with the same `error` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly map: <M>(mapFunction: (value: never) => M) => IErrorResult<E>;\n\n /**\n * Asynchronously returns a new `ErrorResult` with the same `error` property as this one.\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: never) => Promise<M>) => Promise<IErrorResult<E>>;\n\n /**\n * Calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErr: <M>(mapFunction: (error: E) => M) => IErrorResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `error` property, and returns a new `ErrorResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `ErrorResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: E) => Promise<M>) => Promise<IErrorResult<M>>;\n}\n\nexport class ErrorResult<E> implements IErrorResult<E>, IResult<never, 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: (value: never) => M): ErrorResult<E> {\n return new ErrorResult(this.error);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapAsync<M>(mapFunction: (value: never) => Promise<M>): Promise<ErrorResult<E>> {\n return Promise.resolve(new ErrorResult(this.error));\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: (error: E) => Promise<M>): Promise<ErrorResult<M>> {\n return new ErrorResult(await mapFunction(this.error));\n }\n}\n","import type { IResult } from './result.mjs';\n\nexport interface ISuccessResult<T = void> {\n readonly success: true;\n readonly value: T;\n\n /**\n * Calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly map: <M>(mapFunction: (value: T) => M) => ISuccessResult<M>;\n\n /**\n * Asynchronously calls a defined callback function on the `value` property, and returns a new `SuccessResult` with the resulting value.\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapAsync: <M>(mapFunction: (value: T) => Promise<M>) => Promise<ISuccessResult<M>>;\n\n /**\n * Returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n readonly mapErr: <M>(mapFunction: (error: never) => M) => ISuccessResult<T>;\n\n /**\n * Asynchronously returns a new `SuccessResult` with the same `value` property as this one.\n *\n * @param mapFunction the mapping function\n * @returns a new `SuccessResult`\n */\n readonly mapErrAsync: <M>(mapFunction: (error: never) => Promise<M>) => Promise<ISuccessResult<T>>;\n}\n\nexport class SuccessResult<T = void> implements ISuccessResult<T>, IResult<T, never> {\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): SuccessResult<T> {\n return new SuccessResult(this.value);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars, @typescript-eslint/promise-function-async\n public mapErrAsync<M>(mapFunction: (error: never) => Promise<M>): Promise<SuccessResult<T>> {\n return Promise.resolve(new SuccessResult(this.value));\n }\n}\n","import type { IErrorResult } from './errorResult.mjs';\nimport { ErrorResult } from './errorResult.mjs';\nimport type { IResult, Result } from './result.mjs';\nimport type { ISuccessResult } from './successResult.mjs';\nimport { SuccessResult } from './successResult.mjs';\n\nexport type { Result, ISuccessResult, IErrorResult };\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 failure<E>(error: E): IErrorResult<E> {\n return new ErrorResult(error);\n}\n\n/**\n * @deprecated\n */\nexport const fail = failure;\n\nexport const isSuccessResult = <T, E = Error>(result: IResult<T, E>): result is ISuccessResult<T> => {\n return result.success;\n};\n\nexport const isErrorResult = <T, E = Error>(result: IResult<T, E>): result is IErrorResult<E> => {\n return !result.success;\n};\n\nexport function combine(results: Result<unknown, unknown>[]): Result<unknown[], unknown[]> {\n const values: unknown[] = [];\n const errors: unknown[] = [];\n\n for (const r of results) {\n if (r.success) {\n values.push(r.value);\n } else {\n errors.push(r.error);\n }\n }\n\n if (errors.length) {\n return new ErrorResult(errors);\n }\n return new SuccessResult(values);\n}\n\nexport const flatten = (result: Result<unknown, unknown>): Result<unknown, unknown> => {\n if (isSuccessResult(result)) {\n return getValue(result);\n }\n return getError(result);\n};\n\nconst getValue = (result: SuccessResult<unknown>): Result<unknown, unknown> => {\n // value is a SuccessResult, drill down\n if (result.value instanceof SuccessResult) {\n return getValue(result.value);\n }\n\n // value is an ErrorResult, drill down\n if (result.value instanceof ErrorResult) {\n return getError(result.value);\n }\n\n // value is not a Result, return current SuccessResult\n return result;\n};\n\nconst getError = (result: ErrorResult<unknown>): ErrorResult<unknown> => {\n // error is a SuccessResult, consider this SuccessResult's value\n if (result.error instanceof SuccessResult) {\n const value = getValue(result.error);\n\n // if the value is a SuccessResult, swallow it into an error\n if (isSuccessResult(value)) {\n return failure(value);\n }\n\n // otherwise the value is an ErrorResult, return it\n return value;\n }\n\n // error is an ErrorResult, swallow it\n if (result.error instanceof ErrorResult) {\n return getError(result.error);\n }\n\n // error is not a Result, the current ErrorResult\n return result;\n};\n"],"mappings":";AAuCO,IAAM,cAAN,MAAM,aAA6D;AAAA,EAGjE,YAA4B,OAAU;AAAV;AAFnC,SAAgB,UAAU;AAAA,EAEiC;AAAA;AAAA,EAGpD,IAAO,aAAkD;AAC9D,WAAO,IAAI,aAAY,KAAK,KAAK;AAAA,EACnC;AAAA;AAAA,EAGO,SAAY,aAAoE;AACrF,WAAO,QAAQ,QAAQ,IAAI,aAAY,KAAK,KAAK,CAAC;AAAA,EACpD;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,eAAwE;AAAA,EAI5E,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,aAAoD;AACnE,WAAO,IAAI,eAAc,KAAK,KAAK;AAAA,EACrC;AAAA;AAAA,EAGO,YAAe,aAAsE;AAC1F,WAAO,QAAQ,QAAQ,IAAI,eAAc,KAAK,KAAK,CAAC;AAAA,EACtD;AACF;;;ACtDO,SAAS,QAAW,OAA8B;AACvD,SAAO,IAAI,cAAc,KAAU;AACrC;AAEO,SAAS,QAAW,OAA2B;AACpD,SAAO,IAAI,YAAY,KAAK;AAC9B;AAKO,IAAM,OAAO;AAEb,IAAM,kBAAkB,CAAe,WAAuD;AACnG,SAAO,OAAO;AAChB;AAEO,IAAM,gBAAgB,CAAe,WAAqD;AAC/F,SAAO,CAAC,OAAO;AACjB;AAEO,SAAS,QAAQ,SAAmE;AACzF,QAAM,SAAoB,CAAC;AAC3B,QAAM,SAAoB,CAAC;AAE3B,aAAW,KAAK,SAAS;AACvB,QAAI,EAAE,SAAS;AACb,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB,OAAO;AACL,aAAO,KAAK,EAAE,KAAK;AAAA,IACrB;AAAA,EACF;AAEA,MAAI,OAAO,QAAQ;AACjB,WAAO,IAAI,YAAY,MAAM;AAAA,EAC/B;AACA,SAAO,IAAI,cAAc,MAAM;AACjC;AAEO,IAAM,UAAU,CAAC,WAA+D;AACrF,MAAI,gBAAgB,MAAM,GAAG;AAC3B,WAAO,SAAS,MAAM;AAAA,EACxB;AACA,SAAO,SAAS,MAAM;AACxB;AAEA,IAAM,WAAW,CAAC,WAA6D;AAE7E,MAAI,OAAO,iBAAiB,eAAe;AACzC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;AAEA,IAAM,WAAW,CAAC,WAAuD;AAEvE,MAAI,OAAO,iBAAiB,eAAe;AACzC,UAAM,QAAQ,SAAS,OAAO,KAAK;AAGnC,QAAI,gBAAgB,KAAK,GAAG;AAC1B,aAAO,QAAQ,KAAK;AAAA,IACtB;AAGA,WAAO;AAAA,EACT;AAGA,MAAI,OAAO,iBAAiB,aAAa;AACvC,WAAO,SAAS,OAAO,KAAK;AAAA,EAC9B;AAGA,SAAO;AACT;","names":[]}
|