@j2blasco/ts-result 0.0.9 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +139 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +38 -0
- package/dist/index.d.ts +38 -0
- package/dist/index.js +104 -0
- package/dist/index.js.map +1 -0
- package/package.json +34 -26
- package/dist/cjs/index.js +0 -18
- package/dist/cjs/result-functions.js +0 -10
- package/dist/cjs/result.js +0 -95
- package/dist/cjs/utils/test/assert-type.js +0 -8
- package/dist/esm/index.js +0 -2
- package/dist/esm/result-functions.js +0 -6
- package/dist/esm/result.js +0 -85
- package/dist/esm/utils/test/assert-type.js +0 -4
- package/types/index.d.ts +0 -2
- package/types/result-functions.d.ts +0 -3
- package/types/result.d.ts +0 -34
- package/types/utils/test/assert-type.d.ts +0 -2
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
andThen: () => andThen,
|
|
24
|
+
andThenAsync: () => andThenAsync,
|
|
25
|
+
errorUnkown: () => errorUnkown,
|
|
26
|
+
errorWithCode: () => errorWithCode,
|
|
27
|
+
makeSafePromise: () => makeSafePromise,
|
|
28
|
+
resultError: () => resultError,
|
|
29
|
+
resultSuccess: () => resultSuccess,
|
|
30
|
+
resultSuccessVoid: () => resultSuccessVoid,
|
|
31
|
+
unwrapSuccessResult: () => unwrapSuccessResult
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(index_exports);
|
|
34
|
+
|
|
35
|
+
// src/result.ts
|
|
36
|
+
function unwrapSuccessResult(result) {
|
|
37
|
+
if (result instanceof ResultSuccessImp) {
|
|
38
|
+
return result["value"];
|
|
39
|
+
}
|
|
40
|
+
throw new Error("Unreachable code. Result is an error");
|
|
41
|
+
}
|
|
42
|
+
function errorWithCode(code, data) {
|
|
43
|
+
return {
|
|
44
|
+
code,
|
|
45
|
+
data
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
function errorUnkown(message) {
|
|
49
|
+
return {
|
|
50
|
+
code: "unknown",
|
|
51
|
+
data: { message }
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
function resultSuccessVoid() {
|
|
55
|
+
return new ResultSuccessImp(void 0);
|
|
56
|
+
}
|
|
57
|
+
function resultSuccess(value) {
|
|
58
|
+
return new ResultSuccessImp(value);
|
|
59
|
+
}
|
|
60
|
+
var resultError = class {
|
|
61
|
+
static unknown(message) {
|
|
62
|
+
return new ResultErrorImp(errorUnkown(message));
|
|
63
|
+
}
|
|
64
|
+
static withCode(code, data = {}) {
|
|
65
|
+
return new ResultErrorImp(
|
|
66
|
+
errorWithCode(code, data)
|
|
67
|
+
);
|
|
68
|
+
}
|
|
69
|
+
static fromError(error) {
|
|
70
|
+
return new ResultErrorImp(error);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
var ResultSuccessImp = class {
|
|
74
|
+
constructor(value) {
|
|
75
|
+
this.value = value;
|
|
76
|
+
}
|
|
77
|
+
andThen(f) {
|
|
78
|
+
return f(this.value);
|
|
79
|
+
}
|
|
80
|
+
async andThenAsync(f) {
|
|
81
|
+
return await f(this.value);
|
|
82
|
+
}
|
|
83
|
+
catchError(_f) {
|
|
84
|
+
return this;
|
|
85
|
+
}
|
|
86
|
+
async catchErrorAsync(_f) {
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
unwrapOrThrow(_errorCallback) {
|
|
90
|
+
return this.value;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
var ResultErrorImp = class {
|
|
94
|
+
constructor(error) {
|
|
95
|
+
this.error = error;
|
|
96
|
+
}
|
|
97
|
+
andThen(_f) {
|
|
98
|
+
return this;
|
|
99
|
+
}
|
|
100
|
+
async andThenAsync(_f) {
|
|
101
|
+
return this;
|
|
102
|
+
}
|
|
103
|
+
catchError(f) {
|
|
104
|
+
return f(this.error);
|
|
105
|
+
}
|
|
106
|
+
async catchErrorAsync(f) {
|
|
107
|
+
return await f(this.error);
|
|
108
|
+
}
|
|
109
|
+
unwrapOrThrow(errorCallback) {
|
|
110
|
+
if (errorCallback !== void 0) {
|
|
111
|
+
errorCallback(this.error);
|
|
112
|
+
}
|
|
113
|
+
throw this.error;
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
function makeSafePromise(promise) {
|
|
117
|
+
return promise.then((value) => resultSuccess(value)).catch((error) => resultError.unknown(error.message));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// src/result-functions.ts
|
|
121
|
+
function andThen(callback) {
|
|
122
|
+
return (result) => result.andThen(callback);
|
|
123
|
+
}
|
|
124
|
+
function andThenAsync(callback) {
|
|
125
|
+
return (result) => result.andThenAsync(callback);
|
|
126
|
+
}
|
|
127
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
128
|
+
0 && (module.exports = {
|
|
129
|
+
andThen,
|
|
130
|
+
andThenAsync,
|
|
131
|
+
errorUnkown,
|
|
132
|
+
errorWithCode,
|
|
133
|
+
makeSafePromise,
|
|
134
|
+
resultError,
|
|
135
|
+
resultSuccess,
|
|
136
|
+
resultSuccessVoid,
|
|
137
|
+
unwrapSuccessResult
|
|
138
|
+
});
|
|
139
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/result.ts","../src/result-functions.ts"],"sourcesContent":["export * from './result';\r\nexport * from './result-functions';","export interface Result<TSuccess1, TError1> {\r\n andThen<TResult extends Result<any, any>>(\r\n f: (value: TSuccess1) => TResult,\r\n ): Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>;\r\n andThenAsync<TResult extends Result<any, any>>(\r\n f: (value: TSuccess1) => Promise<TResult>,\r\n ): Promise<Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>>;\r\n catchError<TResult extends Result<any, any>>(\r\n f: (error: TError1) => TResult,\r\n ): Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>;\r\n catchErrorAsync<TResult extends Result<any, any>>(\r\n f: (error: TError1) => Promise<TResult>,\r\n ): Promise<Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>>;\r\n unwrapOrThrow(errorCallback?: (e: TError1) => void): TSuccess1;\r\n}\r\n\r\nexport function unwrapSuccessResult<T>(result: Result<T, never>): T {\r\n if (result instanceof ResultSuccessImp) {\r\n return result['value'];\r\n }\r\n throw new Error('Unreachable code. Result is an error');\r\n}\r\n\r\nexport type ErrorWithCode<TCode, TData = object> = { code: TCode; data: TData };\r\nexport function errorWithCode<TCode, TData>(\r\n code: TCode,\r\n data: TData,\r\n): ErrorWithCode<TCode, TData> {\r\n return {\r\n code,\r\n data,\r\n };\r\n}\r\n\r\nexport type ErrorUnknown = {\r\n code: 'unknown';\r\n data: { message: string };\r\n};\r\nexport function errorUnkown(message: string): ErrorUnknown {\r\n return {\r\n code: 'unknown',\r\n data: { message },\r\n };\r\n}\r\n\r\nexport type SuccessType<T> = T extends Result<infer S, any> ? S : never;\r\nexport type ErrorType<T> = T extends Result<any, infer E> ? E : never;\r\n\r\nexport type SuccessVoid = never;\r\n\r\nexport function resultSuccessVoid(): Result<SuccessVoid, never> {\r\n return new ResultSuccessImp<SuccessVoid>(undefined as never);\r\n}\r\n\r\nexport function resultSuccess<TSuccess1>(\r\n value: TSuccess1,\r\n): Result<TSuccess1, never> {\r\n return new ResultSuccessImp<TSuccess1>(value);\r\n}\r\n\r\ntype EnforceLiteral<T> = string extends T ? never : T;\r\n\r\nexport class resultError {\r\n public static unknown(message: string): Result<never, ErrorUnknown> {\r\n return new ResultErrorImp<ErrorUnknown>(errorUnkown(message));\r\n }\r\n public static withCode<TCode, TData = object>(\r\n code: EnforceLiteral<TCode>,\r\n data: TData = {} as TData,\r\n ): Result<never, ErrorWithCode<TCode, TData>> {\r\n return new ResultErrorImp<ErrorWithCode<TCode, TData>>(\r\n errorWithCode(code, data),\r\n );\r\n }\r\n public static fromError<\r\n TSuccess1,\r\n TError1 extends ErrorWithCode<any, object>,\r\n >(error: TError1): Result<TSuccess1, TError1> {\r\n return new ResultErrorImp<TError1>(error);\r\n }\r\n}\r\n\r\nclass ResultSuccessImp<TSuccess1> implements Result<TSuccess1, never> {\r\n constructor(private value: TSuccess1) {}\r\n\r\n public andThen<TSuccess2, TError2>(\r\n f: (value: TSuccess1) => Result<TSuccess2, TError2>,\r\n ): Result<TSuccess2, TError2> {\r\n return f(this.value);\r\n }\r\n\r\n public async andThenAsync<TSuccess2, TError2>(\r\n f: (value: TSuccess1) => Promise<Result<TSuccess2, TError2>>,\r\n ): Promise<Result<TSuccess2, TError2>> {\r\n return await f(this.value);\r\n }\r\n\r\n public catchError<TSuccess2, TError2>(\r\n _f: (error: never) => Result<TSuccess2, TError2>,\r\n ): Result<TSuccess1 | TSuccess2, TError2> {\r\n return this;\r\n }\r\n\r\n public async catchErrorAsync<TSuccess2, TError2>(\r\n _f: (error: never) => Promise<Result<TSuccess2, TError2>>,\r\n ): Promise<Result<TSuccess1 | TSuccess2, TError2>> {\r\n return this;\r\n }\r\n\r\n public unwrapOrThrow(_errorCallback?: (e: never) => void): TSuccess1 {\r\n return this.value;\r\n }\r\n}\r\n\r\nclass ResultErrorImp<TError1> implements Result<never, TError1> {\r\n constructor(private error: TError1) {}\r\n\r\n public andThen<TSuccess2, TError2>(\r\n _f: (value: never) => Result<TSuccess2, TError2>,\r\n ): Result<TSuccess2, TError1 | TError2> {\r\n return this;\r\n }\r\n\r\n public async andThenAsync<TSuccess2, TError2>(\r\n _f: (value: never) => Promise<Result<TSuccess2, TError2>>,\r\n ): Promise<Result<TSuccess2, TError1 | TError2>> {\r\n return this;\r\n }\r\n\r\n public catchError<TSuccess2, TError2>(\r\n f: (error: TError1) => Result<TSuccess2, TError2>,\r\n ): Result<TSuccess2, TError2> {\r\n return f(this.error);\r\n }\r\n\r\n public async catchErrorAsync<TSuccess2, TError2>(\r\n f: (error: TError1) => Promise<Result<TSuccess2, TError2>>,\r\n ): Promise<Result<TSuccess2, TError2>> {\r\n return await f(this.error);\r\n }\r\n\r\n public unwrapOrThrow(errorCallback?: (e: TError1) => void): never {\r\n if (errorCallback !== undefined) {\r\n errorCallback(this.error);\r\n }\r\n throw this.error;\r\n }\r\n}\r\n\r\nexport type UnwrapErrorFromResult<T> =\r\n T extends Result<any, infer U> ? U : never;\r\n\r\nexport function makeSafePromise<T>(\r\n promise: Promise<T>,\r\n): Promise<Result<T, ErrorUnknown>> {\r\n return promise\r\n .then((value) => resultSuccess(value))\r\n .catch((error) => resultError.unknown(error.message));\r\n}","import { ErrorType, Result, SuccessType } from \"./result\";\r\n\r\nexport function andThen<TSuccess, TError, TResult extends Result<any, any>>(\r\n callback: (value: TSuccess) => TResult\r\n): (\r\n result: Result<TSuccess, TError>\r\n) => Result<SuccessType<TResult>, TError | ErrorType<TResult>> {\r\n return (result) => result.andThen(callback);\r\n}\r\n\r\nexport function andThenAsync<\r\n TSuccess,\r\n TError,\r\n TResult extends Result<any, any>\r\n>(\r\n callback: (value: TSuccess) => Promise<TResult>\r\n): (\r\n result: Result<TSuccess, TError>\r\n) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>> {\r\n return (result) => result.andThenAsync(callback);\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACgBO,SAAS,oBAAuB,QAA6B;AAClE,MAAI,kBAAkB,kBAAkB;AACtC,WAAO,OAAO,OAAO;AAAA,EACvB;AACA,QAAM,IAAI,MAAM,sCAAsC;AACxD;AAGO,SAAS,cACd,MACA,MAC6B;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,YAAY,SAA+B;AACzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,EAAE,QAAQ;AAAA,EAClB;AACF;AAOO,SAAS,oBAAgD;AAC9D,SAAO,IAAI,iBAA8B,MAAkB;AAC7D;AAEO,SAAS,cACd,OAC0B;AAC1B,SAAO,IAAI,iBAA4B,KAAK;AAC9C;AAIO,IAAM,cAAN,MAAkB;AAAA,EACvB,OAAc,QAAQ,SAA8C;AAClE,WAAO,IAAI,eAA6B,YAAY,OAAO,CAAC;AAAA,EAC9D;AAAA,EACA,OAAc,SACZ,MACA,OAAc,CAAC,GAC6B;AAC5C,WAAO,IAAI;AAAA,MACT,cAAc,MAAM,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,OAAc,UAGZ,OAA4C;AAC5C,WAAO,IAAI,eAAwB,KAAK;AAAA,EAC1C;AACF;AAEA,IAAM,mBAAN,MAAsE;AAAA,EACpE,YAAoB,OAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhC,QACL,GAC4B;AAC5B,WAAO,EAAE,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,MAAa,aACX,GACqC;AACrC,WAAO,MAAM,EAAE,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEO,WACL,IACwC;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,gBACX,IACiD;AACjD,WAAO;AAAA,EACT;AAAA,EAEO,cAAc,gBAAgD;AACnE,WAAO,KAAK;AAAA,EACd;AACF;AAEA,IAAM,iBAAN,MAAgE;AAAA,EAC9D,YAAoB,OAAgB;AAAhB;AAAA,EAAiB;AAAA,EAE9B,QACL,IACsC;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,aACX,IAC+C;AAC/C,WAAO;AAAA,EACT;AAAA,EAEO,WACL,GAC4B;AAC5B,WAAO,EAAE,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,MAAa,gBACX,GACqC;AACrC,WAAO,MAAM,EAAE,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEO,cAAc,eAA6C;AAChE,QAAI,kBAAkB,QAAW;AAC/B,oBAAc,KAAK,KAAK;AAAA,IAC1B;AACA,UAAM,KAAK;AAAA,EACb;AACF;AAKO,SAAS,gBACd,SACkC;AAClC,SAAO,QACJ,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,EACpC,MAAM,CAAC,UAAU,YAAY,QAAQ,MAAM,OAAO,CAAC;AACxD;;;AC5JO,SAAS,QACd,UAG6D;AAC7D,SAAO,CAAC,WAAW,OAAO,QAAQ,QAAQ;AAC5C;AAEO,SAAS,aAKd,UAGsE;AACtE,SAAO,CAAC,WAAW,OAAO,aAAa,QAAQ;AACjD;","names":[]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface Result<TSuccess1, TError1> {
|
|
2
|
+
andThen<TResult extends Result<any, any>>(f: (value: TSuccess1) => TResult): Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>;
|
|
3
|
+
andThenAsync<TResult extends Result<any, any>>(f: (value: TSuccess1) => Promise<TResult>): Promise<Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>>;
|
|
4
|
+
catchError<TResult extends Result<any, any>>(f: (error: TError1) => TResult): Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>;
|
|
5
|
+
catchErrorAsync<TResult extends Result<any, any>>(f: (error: TError1) => Promise<TResult>): Promise<Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>>;
|
|
6
|
+
unwrapOrThrow(errorCallback?: (e: TError1) => void): TSuccess1;
|
|
7
|
+
}
|
|
8
|
+
declare function unwrapSuccessResult<T>(result: Result<T, never>): T;
|
|
9
|
+
type ErrorWithCode<TCode, TData = object> = {
|
|
10
|
+
code: TCode;
|
|
11
|
+
data: TData;
|
|
12
|
+
};
|
|
13
|
+
declare function errorWithCode<TCode, TData>(code: TCode, data: TData): ErrorWithCode<TCode, TData>;
|
|
14
|
+
type ErrorUnknown = {
|
|
15
|
+
code: 'unknown';
|
|
16
|
+
data: {
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
declare function errorUnkown(message: string): ErrorUnknown;
|
|
21
|
+
type SuccessType<T> = T extends Result<infer S, any> ? S : never;
|
|
22
|
+
type ErrorType<T> = T extends Result<any, infer E> ? E : never;
|
|
23
|
+
type SuccessVoid = never;
|
|
24
|
+
declare function resultSuccessVoid(): Result<SuccessVoid, never>;
|
|
25
|
+
declare function resultSuccess<TSuccess1>(value: TSuccess1): Result<TSuccess1, never>;
|
|
26
|
+
type EnforceLiteral<T> = string extends T ? never : T;
|
|
27
|
+
declare class resultError {
|
|
28
|
+
static unknown(message: string): Result<never, ErrorUnknown>;
|
|
29
|
+
static withCode<TCode, TData = object>(code: EnforceLiteral<TCode>, data?: TData): Result<never, ErrorWithCode<TCode, TData>>;
|
|
30
|
+
static fromError<TSuccess1, TError1 extends ErrorWithCode<any, object>>(error: TError1): Result<TSuccess1, TError1>;
|
|
31
|
+
}
|
|
32
|
+
type UnwrapErrorFromResult<T> = T extends Result<any, infer U> ? U : never;
|
|
33
|
+
declare function makeSafePromise<T>(promise: Promise<T>): Promise<Result<T, ErrorUnknown>>;
|
|
34
|
+
|
|
35
|
+
declare function andThen<TSuccess, TError, TResult extends Result<any, any>>(callback: (value: TSuccess) => TResult): (result: Result<TSuccess, TError>) => Result<SuccessType<TResult>, TError | ErrorType<TResult>>;
|
|
36
|
+
declare function andThenAsync<TSuccess, TError, TResult extends Result<any, any>>(callback: (value: TSuccess) => Promise<TResult>): (result: Result<TSuccess, TError>) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>>;
|
|
37
|
+
|
|
38
|
+
export { type ErrorType, type ErrorUnknown, type ErrorWithCode, type Result, type SuccessType, type SuccessVoid, type UnwrapErrorFromResult, andThen, andThenAsync, errorUnkown, errorWithCode, makeSafePromise, resultError, resultSuccess, resultSuccessVoid, unwrapSuccessResult };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
interface Result<TSuccess1, TError1> {
|
|
2
|
+
andThen<TResult extends Result<any, any>>(f: (value: TSuccess1) => TResult): Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>;
|
|
3
|
+
andThenAsync<TResult extends Result<any, any>>(f: (value: TSuccess1) => Promise<TResult>): Promise<Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>>;
|
|
4
|
+
catchError<TResult extends Result<any, any>>(f: (error: TError1) => TResult): Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>;
|
|
5
|
+
catchErrorAsync<TResult extends Result<any, any>>(f: (error: TError1) => Promise<TResult>): Promise<Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>>;
|
|
6
|
+
unwrapOrThrow(errorCallback?: (e: TError1) => void): TSuccess1;
|
|
7
|
+
}
|
|
8
|
+
declare function unwrapSuccessResult<T>(result: Result<T, never>): T;
|
|
9
|
+
type ErrorWithCode<TCode, TData = object> = {
|
|
10
|
+
code: TCode;
|
|
11
|
+
data: TData;
|
|
12
|
+
};
|
|
13
|
+
declare function errorWithCode<TCode, TData>(code: TCode, data: TData): ErrorWithCode<TCode, TData>;
|
|
14
|
+
type ErrorUnknown = {
|
|
15
|
+
code: 'unknown';
|
|
16
|
+
data: {
|
|
17
|
+
message: string;
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
declare function errorUnkown(message: string): ErrorUnknown;
|
|
21
|
+
type SuccessType<T> = T extends Result<infer S, any> ? S : never;
|
|
22
|
+
type ErrorType<T> = T extends Result<any, infer E> ? E : never;
|
|
23
|
+
type SuccessVoid = never;
|
|
24
|
+
declare function resultSuccessVoid(): Result<SuccessVoid, never>;
|
|
25
|
+
declare function resultSuccess<TSuccess1>(value: TSuccess1): Result<TSuccess1, never>;
|
|
26
|
+
type EnforceLiteral<T> = string extends T ? never : T;
|
|
27
|
+
declare class resultError {
|
|
28
|
+
static unknown(message: string): Result<never, ErrorUnknown>;
|
|
29
|
+
static withCode<TCode, TData = object>(code: EnforceLiteral<TCode>, data?: TData): Result<never, ErrorWithCode<TCode, TData>>;
|
|
30
|
+
static fromError<TSuccess1, TError1 extends ErrorWithCode<any, object>>(error: TError1): Result<TSuccess1, TError1>;
|
|
31
|
+
}
|
|
32
|
+
type UnwrapErrorFromResult<T> = T extends Result<any, infer U> ? U : never;
|
|
33
|
+
declare function makeSafePromise<T>(promise: Promise<T>): Promise<Result<T, ErrorUnknown>>;
|
|
34
|
+
|
|
35
|
+
declare function andThen<TSuccess, TError, TResult extends Result<any, any>>(callback: (value: TSuccess) => TResult): (result: Result<TSuccess, TError>) => Result<SuccessType<TResult>, TError | ErrorType<TResult>>;
|
|
36
|
+
declare function andThenAsync<TSuccess, TError, TResult extends Result<any, any>>(callback: (value: TSuccess) => Promise<TResult>): (result: Result<TSuccess, TError>) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>>;
|
|
37
|
+
|
|
38
|
+
export { type ErrorType, type ErrorUnknown, type ErrorWithCode, type Result, type SuccessType, type SuccessVoid, type UnwrapErrorFromResult, andThen, andThenAsync, errorUnkown, errorWithCode, makeSafePromise, resultError, resultSuccess, resultSuccessVoid, unwrapSuccessResult };
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
// src/result.ts
|
|
2
|
+
function unwrapSuccessResult(result) {
|
|
3
|
+
if (result instanceof ResultSuccessImp) {
|
|
4
|
+
return result["value"];
|
|
5
|
+
}
|
|
6
|
+
throw new Error("Unreachable code. Result is an error");
|
|
7
|
+
}
|
|
8
|
+
function errorWithCode(code, data) {
|
|
9
|
+
return {
|
|
10
|
+
code,
|
|
11
|
+
data
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
function errorUnkown(message) {
|
|
15
|
+
return {
|
|
16
|
+
code: "unknown",
|
|
17
|
+
data: { message }
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
function resultSuccessVoid() {
|
|
21
|
+
return new ResultSuccessImp(void 0);
|
|
22
|
+
}
|
|
23
|
+
function resultSuccess(value) {
|
|
24
|
+
return new ResultSuccessImp(value);
|
|
25
|
+
}
|
|
26
|
+
var resultError = class {
|
|
27
|
+
static unknown(message) {
|
|
28
|
+
return new ResultErrorImp(errorUnkown(message));
|
|
29
|
+
}
|
|
30
|
+
static withCode(code, data = {}) {
|
|
31
|
+
return new ResultErrorImp(
|
|
32
|
+
errorWithCode(code, data)
|
|
33
|
+
);
|
|
34
|
+
}
|
|
35
|
+
static fromError(error) {
|
|
36
|
+
return new ResultErrorImp(error);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
var ResultSuccessImp = class {
|
|
40
|
+
constructor(value) {
|
|
41
|
+
this.value = value;
|
|
42
|
+
}
|
|
43
|
+
andThen(f) {
|
|
44
|
+
return f(this.value);
|
|
45
|
+
}
|
|
46
|
+
async andThenAsync(f) {
|
|
47
|
+
return await f(this.value);
|
|
48
|
+
}
|
|
49
|
+
catchError(_f) {
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
async catchErrorAsync(_f) {
|
|
53
|
+
return this;
|
|
54
|
+
}
|
|
55
|
+
unwrapOrThrow(_errorCallback) {
|
|
56
|
+
return this.value;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
var ResultErrorImp = class {
|
|
60
|
+
constructor(error) {
|
|
61
|
+
this.error = error;
|
|
62
|
+
}
|
|
63
|
+
andThen(_f) {
|
|
64
|
+
return this;
|
|
65
|
+
}
|
|
66
|
+
async andThenAsync(_f) {
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
catchError(f) {
|
|
70
|
+
return f(this.error);
|
|
71
|
+
}
|
|
72
|
+
async catchErrorAsync(f) {
|
|
73
|
+
return await f(this.error);
|
|
74
|
+
}
|
|
75
|
+
unwrapOrThrow(errorCallback) {
|
|
76
|
+
if (errorCallback !== void 0) {
|
|
77
|
+
errorCallback(this.error);
|
|
78
|
+
}
|
|
79
|
+
throw this.error;
|
|
80
|
+
}
|
|
81
|
+
};
|
|
82
|
+
function makeSafePromise(promise) {
|
|
83
|
+
return promise.then((value) => resultSuccess(value)).catch((error) => resultError.unknown(error.message));
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// src/result-functions.ts
|
|
87
|
+
function andThen(callback) {
|
|
88
|
+
return (result) => result.andThen(callback);
|
|
89
|
+
}
|
|
90
|
+
function andThenAsync(callback) {
|
|
91
|
+
return (result) => result.andThenAsync(callback);
|
|
92
|
+
}
|
|
93
|
+
export {
|
|
94
|
+
andThen,
|
|
95
|
+
andThenAsync,
|
|
96
|
+
errorUnkown,
|
|
97
|
+
errorWithCode,
|
|
98
|
+
makeSafePromise,
|
|
99
|
+
resultError,
|
|
100
|
+
resultSuccess,
|
|
101
|
+
resultSuccessVoid,
|
|
102
|
+
unwrapSuccessResult
|
|
103
|
+
};
|
|
104
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/result.ts","../src/result-functions.ts"],"sourcesContent":["export interface Result<TSuccess1, TError1> {\r\n andThen<TResult extends Result<any, any>>(\r\n f: (value: TSuccess1) => TResult,\r\n ): Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>;\r\n andThenAsync<TResult extends Result<any, any>>(\r\n f: (value: TSuccess1) => Promise<TResult>,\r\n ): Promise<Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>>;\r\n catchError<TResult extends Result<any, any>>(\r\n f: (error: TError1) => TResult,\r\n ): Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>;\r\n catchErrorAsync<TResult extends Result<any, any>>(\r\n f: (error: TError1) => Promise<TResult>,\r\n ): Promise<Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>>;\r\n unwrapOrThrow(errorCallback?: (e: TError1) => void): TSuccess1;\r\n}\r\n\r\nexport function unwrapSuccessResult<T>(result: Result<T, never>): T {\r\n if (result instanceof ResultSuccessImp) {\r\n return result['value'];\r\n }\r\n throw new Error('Unreachable code. Result is an error');\r\n}\r\n\r\nexport type ErrorWithCode<TCode, TData = object> = { code: TCode; data: TData };\r\nexport function errorWithCode<TCode, TData>(\r\n code: TCode,\r\n data: TData,\r\n): ErrorWithCode<TCode, TData> {\r\n return {\r\n code,\r\n data,\r\n };\r\n}\r\n\r\nexport type ErrorUnknown = {\r\n code: 'unknown';\r\n data: { message: string };\r\n};\r\nexport function errorUnkown(message: string): ErrorUnknown {\r\n return {\r\n code: 'unknown',\r\n data: { message },\r\n };\r\n}\r\n\r\nexport type SuccessType<T> = T extends Result<infer S, any> ? S : never;\r\nexport type ErrorType<T> = T extends Result<any, infer E> ? E : never;\r\n\r\nexport type SuccessVoid = never;\r\n\r\nexport function resultSuccessVoid(): Result<SuccessVoid, never> {\r\n return new ResultSuccessImp<SuccessVoid>(undefined as never);\r\n}\r\n\r\nexport function resultSuccess<TSuccess1>(\r\n value: TSuccess1,\r\n): Result<TSuccess1, never> {\r\n return new ResultSuccessImp<TSuccess1>(value);\r\n}\r\n\r\ntype EnforceLiteral<T> = string extends T ? never : T;\r\n\r\nexport class resultError {\r\n public static unknown(message: string): Result<never, ErrorUnknown> {\r\n return new ResultErrorImp<ErrorUnknown>(errorUnkown(message));\r\n }\r\n public static withCode<TCode, TData = object>(\r\n code: EnforceLiteral<TCode>,\r\n data: TData = {} as TData,\r\n ): Result<never, ErrorWithCode<TCode, TData>> {\r\n return new ResultErrorImp<ErrorWithCode<TCode, TData>>(\r\n errorWithCode(code, data),\r\n );\r\n }\r\n public static fromError<\r\n TSuccess1,\r\n TError1 extends ErrorWithCode<any, object>,\r\n >(error: TError1): Result<TSuccess1, TError1> {\r\n return new ResultErrorImp<TError1>(error);\r\n }\r\n}\r\n\r\nclass ResultSuccessImp<TSuccess1> implements Result<TSuccess1, never> {\r\n constructor(private value: TSuccess1) {}\r\n\r\n public andThen<TSuccess2, TError2>(\r\n f: (value: TSuccess1) => Result<TSuccess2, TError2>,\r\n ): Result<TSuccess2, TError2> {\r\n return f(this.value);\r\n }\r\n\r\n public async andThenAsync<TSuccess2, TError2>(\r\n f: (value: TSuccess1) => Promise<Result<TSuccess2, TError2>>,\r\n ): Promise<Result<TSuccess2, TError2>> {\r\n return await f(this.value);\r\n }\r\n\r\n public catchError<TSuccess2, TError2>(\r\n _f: (error: never) => Result<TSuccess2, TError2>,\r\n ): Result<TSuccess1 | TSuccess2, TError2> {\r\n return this;\r\n }\r\n\r\n public async catchErrorAsync<TSuccess2, TError2>(\r\n _f: (error: never) => Promise<Result<TSuccess2, TError2>>,\r\n ): Promise<Result<TSuccess1 | TSuccess2, TError2>> {\r\n return this;\r\n }\r\n\r\n public unwrapOrThrow(_errorCallback?: (e: never) => void): TSuccess1 {\r\n return this.value;\r\n }\r\n}\r\n\r\nclass ResultErrorImp<TError1> implements Result<never, TError1> {\r\n constructor(private error: TError1) {}\r\n\r\n public andThen<TSuccess2, TError2>(\r\n _f: (value: never) => Result<TSuccess2, TError2>,\r\n ): Result<TSuccess2, TError1 | TError2> {\r\n return this;\r\n }\r\n\r\n public async andThenAsync<TSuccess2, TError2>(\r\n _f: (value: never) => Promise<Result<TSuccess2, TError2>>,\r\n ): Promise<Result<TSuccess2, TError1 | TError2>> {\r\n return this;\r\n }\r\n\r\n public catchError<TSuccess2, TError2>(\r\n f: (error: TError1) => Result<TSuccess2, TError2>,\r\n ): Result<TSuccess2, TError2> {\r\n return f(this.error);\r\n }\r\n\r\n public async catchErrorAsync<TSuccess2, TError2>(\r\n f: (error: TError1) => Promise<Result<TSuccess2, TError2>>,\r\n ): Promise<Result<TSuccess2, TError2>> {\r\n return await f(this.error);\r\n }\r\n\r\n public unwrapOrThrow(errorCallback?: (e: TError1) => void): never {\r\n if (errorCallback !== undefined) {\r\n errorCallback(this.error);\r\n }\r\n throw this.error;\r\n }\r\n}\r\n\r\nexport type UnwrapErrorFromResult<T> =\r\n T extends Result<any, infer U> ? U : never;\r\n\r\nexport function makeSafePromise<T>(\r\n promise: Promise<T>,\r\n): Promise<Result<T, ErrorUnknown>> {\r\n return promise\r\n .then((value) => resultSuccess(value))\r\n .catch((error) => resultError.unknown(error.message));\r\n}","import { ErrorType, Result, SuccessType } from \"./result\";\r\n\r\nexport function andThen<TSuccess, TError, TResult extends Result<any, any>>(\r\n callback: (value: TSuccess) => TResult\r\n): (\r\n result: Result<TSuccess, TError>\r\n) => Result<SuccessType<TResult>, TError | ErrorType<TResult>> {\r\n return (result) => result.andThen(callback);\r\n}\r\n\r\nexport function andThenAsync<\r\n TSuccess,\r\n TError,\r\n TResult extends Result<any, any>\r\n>(\r\n callback: (value: TSuccess) => Promise<TResult>\r\n): (\r\n result: Result<TSuccess, TError>\r\n) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>> {\r\n return (result) => result.andThenAsync(callback);\r\n}\r\n"],"mappings":";AAgBO,SAAS,oBAAuB,QAA6B;AAClE,MAAI,kBAAkB,kBAAkB;AACtC,WAAO,OAAO,OAAO;AAAA,EACvB;AACA,QAAM,IAAI,MAAM,sCAAsC;AACxD;AAGO,SAAS,cACd,MACA,MAC6B;AAC7B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,EACF;AACF;AAMO,SAAS,YAAY,SAA+B;AACzD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,MAAM,EAAE,QAAQ;AAAA,EAClB;AACF;AAOO,SAAS,oBAAgD;AAC9D,SAAO,IAAI,iBAA8B,MAAkB;AAC7D;AAEO,SAAS,cACd,OAC0B;AAC1B,SAAO,IAAI,iBAA4B,KAAK;AAC9C;AAIO,IAAM,cAAN,MAAkB;AAAA,EACvB,OAAc,QAAQ,SAA8C;AAClE,WAAO,IAAI,eAA6B,YAAY,OAAO,CAAC;AAAA,EAC9D;AAAA,EACA,OAAc,SACZ,MACA,OAAc,CAAC,GAC6B;AAC5C,WAAO,IAAI;AAAA,MACT,cAAc,MAAM,IAAI;AAAA,IAC1B;AAAA,EACF;AAAA,EACA,OAAc,UAGZ,OAA4C;AAC5C,WAAO,IAAI,eAAwB,KAAK;AAAA,EAC1C;AACF;AAEA,IAAM,mBAAN,MAAsE;AAAA,EACpE,YAAoB,OAAkB;AAAlB;AAAA,EAAmB;AAAA,EAEhC,QACL,GAC4B;AAC5B,WAAO,EAAE,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,MAAa,aACX,GACqC;AACrC,WAAO,MAAM,EAAE,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEO,WACL,IACwC;AACxC,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,gBACX,IACiD;AACjD,WAAO;AAAA,EACT;AAAA,EAEO,cAAc,gBAAgD;AACnE,WAAO,KAAK;AAAA,EACd;AACF;AAEA,IAAM,iBAAN,MAAgE;AAAA,EAC9D,YAAoB,OAAgB;AAAhB;AAAA,EAAiB;AAAA,EAE9B,QACL,IACsC;AACtC,WAAO;AAAA,EACT;AAAA,EAEA,MAAa,aACX,IAC+C;AAC/C,WAAO;AAAA,EACT;AAAA,EAEO,WACL,GAC4B;AAC5B,WAAO,EAAE,KAAK,KAAK;AAAA,EACrB;AAAA,EAEA,MAAa,gBACX,GACqC;AACrC,WAAO,MAAM,EAAE,KAAK,KAAK;AAAA,EAC3B;AAAA,EAEO,cAAc,eAA6C;AAChE,QAAI,kBAAkB,QAAW;AAC/B,oBAAc,KAAK,KAAK;AAAA,IAC1B;AACA,UAAM,KAAK;AAAA,EACb;AACF;AAKO,SAAS,gBACd,SACkC;AAClC,SAAO,QACJ,KAAK,CAAC,UAAU,cAAc,KAAK,CAAC,EACpC,MAAM,CAAC,UAAU,YAAY,QAAQ,MAAM,OAAO,CAAC;AACxD;;;AC5JO,SAAS,QACd,UAG6D;AAC7D,SAAO,CAAC,WAAW,OAAO,QAAQ,QAAQ;AAC5C;AAEO,SAAS,aAKd,UAGsE;AACtE,SAAO,CAAC,WAAW,OAAO,aAAa,QAAQ;AACjD;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,43 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@j2blasco/ts-result",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Result Monad for TypeScript",
|
|
5
|
-
"
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"description": "Result Monad for TypeScript",
|
|
5
|
+
"author": "j2blasco",
|
|
6
|
+
"license": "MIT",
|
|
7
|
+
"keywords": [
|
|
8
|
+
"typescript",
|
|
9
|
+
"result",
|
|
10
|
+
"monad",
|
|
11
|
+
"error-handling"
|
|
12
|
+
],
|
|
13
|
+
"publishConfig": {
|
|
14
|
+
"access": "public"
|
|
15
|
+
},
|
|
16
|
+
"main": "./dist/index.cjs",
|
|
17
|
+
"module": "./dist/index.js",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
6
19
|
"repository": {
|
|
7
20
|
"type": "git",
|
|
8
21
|
"url": "https://github.com/j2blasco/ts-crud"
|
|
9
22
|
},
|
|
10
|
-
"types": "./types/index.d.ts",
|
|
11
23
|
"exports": {
|
|
12
24
|
".": {
|
|
13
|
-
"types": "./
|
|
14
|
-
"import": "./dist/
|
|
15
|
-
"require": "./dist/
|
|
25
|
+
"types": "./dist/index.d.ts",
|
|
26
|
+
"import": "./dist/index.js",
|
|
27
|
+
"require": "./dist/index.cjs"
|
|
16
28
|
}
|
|
17
|
-
},
|
|
18
|
-
|
|
19
|
-
"dist
|
|
20
|
-
"types",
|
|
29
|
+
},
|
|
30
|
+
"files": [
|
|
31
|
+
"dist",
|
|
21
32
|
"README.md",
|
|
22
33
|
"LICENSE"
|
|
23
|
-
],
|
|
24
|
-
|
|
25
|
-
"build": "npm run
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
34
|
+
],
|
|
35
|
+
"scripts": {
|
|
36
|
+
"build": "npm run clean && tsup --dts",
|
|
37
|
+
"clean": "shx rm -rf dist",
|
|
38
|
+
"prepublishOnly": "npm run build",
|
|
39
|
+
"test": "jest"
|
|
29
40
|
},
|
|
30
|
-
"
|
|
31
|
-
"
|
|
32
|
-
"license": "MIT",
|
|
33
|
-
"type": "module", "devDependencies": {
|
|
41
|
+
"type": "module",
|
|
42
|
+
"devDependencies": {
|
|
34
43
|
"@j2blasco/ts-pipe": "^0.0.4",
|
|
35
44
|
"@types/jest": "^29.5.14",
|
|
36
45
|
"jest": "^29.7.0",
|
|
37
|
-
"
|
|
38
|
-
"ts-jest": "^29.3.2"
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
"access": "public"
|
|
46
|
+
"shx": "^0.4.0",
|
|
47
|
+
"ts-jest": "^29.3.2",
|
|
48
|
+
"tsup": "^8.5.0",
|
|
49
|
+
"typescript": "~5.7.2"
|
|
42
50
|
}
|
|
43
51
|
}
|
package/dist/cjs/index.js
DELETED
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
-
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
-
};
|
|
16
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
-
__exportStar(require("./result"), exports);
|
|
18
|
-
__exportStar(require("./result-functions"), exports);
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.andThen = andThen;
|
|
4
|
-
exports.andThenAsync = andThenAsync;
|
|
5
|
-
function andThen(callback) {
|
|
6
|
-
return (result) => result.andThen(callback);
|
|
7
|
-
}
|
|
8
|
-
function andThenAsync(callback) {
|
|
9
|
-
return (result) => result.andThenAsync(callback);
|
|
10
|
-
}
|
package/dist/cjs/result.js
DELETED
|
@@ -1,95 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.resultError = void 0;
|
|
4
|
-
exports.unwrapSuccessResult = unwrapSuccessResult;
|
|
5
|
-
exports.errorWithCode = errorWithCode;
|
|
6
|
-
exports.errorUnkown = errorUnkown;
|
|
7
|
-
exports.resultSuccessVoid = resultSuccessVoid;
|
|
8
|
-
exports.resultSuccess = resultSuccess;
|
|
9
|
-
exports.makeSafePromise = makeSafePromise;
|
|
10
|
-
function unwrapSuccessResult(result) {
|
|
11
|
-
if (result instanceof ResultSuccessImp) {
|
|
12
|
-
return result['value'];
|
|
13
|
-
}
|
|
14
|
-
throw new Error('Unreachable code. Result is an error');
|
|
15
|
-
}
|
|
16
|
-
function errorWithCode(code, data) {
|
|
17
|
-
return {
|
|
18
|
-
code,
|
|
19
|
-
data,
|
|
20
|
-
};
|
|
21
|
-
}
|
|
22
|
-
function errorUnkown(message) {
|
|
23
|
-
return {
|
|
24
|
-
code: 'unknown',
|
|
25
|
-
data: { message },
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
function resultSuccessVoid() {
|
|
29
|
-
return new ResultSuccessImp(undefined);
|
|
30
|
-
}
|
|
31
|
-
function resultSuccess(value) {
|
|
32
|
-
return new ResultSuccessImp(value);
|
|
33
|
-
}
|
|
34
|
-
class resultError {
|
|
35
|
-
static unknown(message) {
|
|
36
|
-
return new ResultErrorImp(errorUnkown(message));
|
|
37
|
-
}
|
|
38
|
-
static withCode(code, data = {}) {
|
|
39
|
-
return new ResultErrorImp(errorWithCode(code, data));
|
|
40
|
-
}
|
|
41
|
-
static fromError(error) {
|
|
42
|
-
return new ResultErrorImp(error);
|
|
43
|
-
}
|
|
44
|
-
}
|
|
45
|
-
exports.resultError = resultError;
|
|
46
|
-
class ResultSuccessImp {
|
|
47
|
-
value;
|
|
48
|
-
constructor(value) {
|
|
49
|
-
this.value = value;
|
|
50
|
-
}
|
|
51
|
-
andThen(f) {
|
|
52
|
-
return f(this.value);
|
|
53
|
-
}
|
|
54
|
-
async andThenAsync(f) {
|
|
55
|
-
return await f(this.value);
|
|
56
|
-
}
|
|
57
|
-
catchError(_f) {
|
|
58
|
-
return this;
|
|
59
|
-
}
|
|
60
|
-
async catchErrorAsync(_f) {
|
|
61
|
-
return this;
|
|
62
|
-
}
|
|
63
|
-
unwrapOrThrow(_errorCallback) {
|
|
64
|
-
return this.value;
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
class ResultErrorImp {
|
|
68
|
-
error;
|
|
69
|
-
constructor(error) {
|
|
70
|
-
this.error = error;
|
|
71
|
-
}
|
|
72
|
-
andThen(_f) {
|
|
73
|
-
return this;
|
|
74
|
-
}
|
|
75
|
-
async andThenAsync(_f) {
|
|
76
|
-
return this;
|
|
77
|
-
}
|
|
78
|
-
catchError(f) {
|
|
79
|
-
return f(this.error);
|
|
80
|
-
}
|
|
81
|
-
async catchErrorAsync(f) {
|
|
82
|
-
return await f(this.error);
|
|
83
|
-
}
|
|
84
|
-
unwrapOrThrow(errorCallback) {
|
|
85
|
-
if (errorCallback !== undefined) {
|
|
86
|
-
errorCallback(this.error);
|
|
87
|
-
}
|
|
88
|
-
throw this.error;
|
|
89
|
-
}
|
|
90
|
-
}
|
|
91
|
-
function makeSafePromise(promise) {
|
|
92
|
-
return promise
|
|
93
|
-
.then((value) => resultSuccess(value))
|
|
94
|
-
.catch((error) => resultError.unknown(error.message));
|
|
95
|
-
}
|
package/dist/esm/index.js
DELETED
package/dist/esm/result.js
DELETED
|
@@ -1,85 +0,0 @@
|
|
|
1
|
-
export function unwrapSuccessResult(result) {
|
|
2
|
-
if (result instanceof ResultSuccessImp) {
|
|
3
|
-
return result['value'];
|
|
4
|
-
}
|
|
5
|
-
throw new Error('Unreachable code. Result is an error');
|
|
6
|
-
}
|
|
7
|
-
export function errorWithCode(code, data) {
|
|
8
|
-
return {
|
|
9
|
-
code,
|
|
10
|
-
data,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
export function errorUnkown(message) {
|
|
14
|
-
return {
|
|
15
|
-
code: 'unknown',
|
|
16
|
-
data: { message },
|
|
17
|
-
};
|
|
18
|
-
}
|
|
19
|
-
export function resultSuccessVoid() {
|
|
20
|
-
return new ResultSuccessImp(undefined);
|
|
21
|
-
}
|
|
22
|
-
export function resultSuccess(value) {
|
|
23
|
-
return new ResultSuccessImp(value);
|
|
24
|
-
}
|
|
25
|
-
export class resultError {
|
|
26
|
-
static unknown(message) {
|
|
27
|
-
return new ResultErrorImp(errorUnkown(message));
|
|
28
|
-
}
|
|
29
|
-
static withCode(code, data = {}) {
|
|
30
|
-
return new ResultErrorImp(errorWithCode(code, data));
|
|
31
|
-
}
|
|
32
|
-
static fromError(error) {
|
|
33
|
-
return new ResultErrorImp(error);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
class ResultSuccessImp {
|
|
37
|
-
value;
|
|
38
|
-
constructor(value) {
|
|
39
|
-
this.value = value;
|
|
40
|
-
}
|
|
41
|
-
andThen(f) {
|
|
42
|
-
return f(this.value);
|
|
43
|
-
}
|
|
44
|
-
async andThenAsync(f) {
|
|
45
|
-
return await f(this.value);
|
|
46
|
-
}
|
|
47
|
-
catchError(_f) {
|
|
48
|
-
return this;
|
|
49
|
-
}
|
|
50
|
-
async catchErrorAsync(_f) {
|
|
51
|
-
return this;
|
|
52
|
-
}
|
|
53
|
-
unwrapOrThrow(_errorCallback) {
|
|
54
|
-
return this.value;
|
|
55
|
-
}
|
|
56
|
-
}
|
|
57
|
-
class ResultErrorImp {
|
|
58
|
-
error;
|
|
59
|
-
constructor(error) {
|
|
60
|
-
this.error = error;
|
|
61
|
-
}
|
|
62
|
-
andThen(_f) {
|
|
63
|
-
return this;
|
|
64
|
-
}
|
|
65
|
-
async andThenAsync(_f) {
|
|
66
|
-
return this;
|
|
67
|
-
}
|
|
68
|
-
catchError(f) {
|
|
69
|
-
return f(this.error);
|
|
70
|
-
}
|
|
71
|
-
async catchErrorAsync(f) {
|
|
72
|
-
return await f(this.error);
|
|
73
|
-
}
|
|
74
|
-
unwrapOrThrow(errorCallback) {
|
|
75
|
-
if (errorCallback !== undefined) {
|
|
76
|
-
errorCallback(this.error);
|
|
77
|
-
}
|
|
78
|
-
throw this.error;
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
export function makeSafePromise(promise) {
|
|
82
|
-
return promise
|
|
83
|
-
.then((value) => resultSuccess(value))
|
|
84
|
-
.catch((error) => resultError.unknown(error.message));
|
|
85
|
-
}
|
package/types/index.d.ts
DELETED
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import { ErrorType, Result, SuccessType } from "./result";
|
|
2
|
-
export declare function andThen<TSuccess, TError, TResult extends Result<any, any>>(callback: (value: TSuccess) => TResult): (result: Result<TSuccess, TError>) => Result<SuccessType<TResult>, TError | ErrorType<TResult>>;
|
|
3
|
-
export declare function andThenAsync<TSuccess, TError, TResult extends Result<any, any>>(callback: (value: TSuccess) => Promise<TResult>): (result: Result<TSuccess, TError>) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>>;
|
package/types/result.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export interface Result<TSuccess1, TError1> {
|
|
2
|
-
andThen<TResult extends Result<any, any>>(f: (value: TSuccess1) => TResult): Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>;
|
|
3
|
-
andThenAsync<TResult extends Result<any, any>>(f: (value: TSuccess1) => Promise<TResult>): Promise<Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>>;
|
|
4
|
-
catchError<TResult extends Result<any, any>>(f: (error: TError1) => TResult): Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>;
|
|
5
|
-
catchErrorAsync<TResult extends Result<any, any>>(f: (error: TError1) => Promise<TResult>): Promise<Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>>;
|
|
6
|
-
unwrapOrThrow(errorCallback?: (e: TError1) => void): TSuccess1;
|
|
7
|
-
}
|
|
8
|
-
export declare function unwrapSuccessResult<T>(result: Result<T, never>): T;
|
|
9
|
-
export type ErrorWithCode<TCode, TData = object> = {
|
|
10
|
-
code: TCode;
|
|
11
|
-
data: TData;
|
|
12
|
-
};
|
|
13
|
-
export declare function errorWithCode<TCode, TData>(code: TCode, data: TData): ErrorWithCode<TCode, TData>;
|
|
14
|
-
export type ErrorUnknown = {
|
|
15
|
-
code: 'unknown';
|
|
16
|
-
data: {
|
|
17
|
-
message: string;
|
|
18
|
-
};
|
|
19
|
-
};
|
|
20
|
-
export declare function errorUnkown(message: string): ErrorUnknown;
|
|
21
|
-
export type SuccessType<T> = T extends Result<infer S, any> ? S : never;
|
|
22
|
-
export type ErrorType<T> = T extends Result<any, infer E> ? E : never;
|
|
23
|
-
export type SuccessVoid = never;
|
|
24
|
-
export declare function resultSuccessVoid(): Result<SuccessVoid, never>;
|
|
25
|
-
export declare function resultSuccess<TSuccess1>(value: TSuccess1): Result<TSuccess1, never>;
|
|
26
|
-
type EnforceLiteral<T> = string extends T ? never : T;
|
|
27
|
-
export declare class resultError {
|
|
28
|
-
static unknown(message: string): Result<never, ErrorUnknown>;
|
|
29
|
-
static withCode<TCode, TData = object>(code: EnforceLiteral<TCode>, data?: TData): Result<never, ErrorWithCode<TCode, TData>>;
|
|
30
|
-
static fromError<TSuccess1, TError1 extends ErrorWithCode<any, object>>(error: TError1): Result<TSuccess1, TError1>;
|
|
31
|
-
}
|
|
32
|
-
export type UnwrapErrorFromResult<T> = T extends Result<any, infer U> ? U : never;
|
|
33
|
-
export declare function makeSafePromise<T>(promise: Promise<T>): Promise<Result<T, ErrorUnknown>>;
|
|
34
|
-
export {};
|