@j2blasco/ts-result 0.1.12 → 0.1.15

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 CHANGED
@@ -24,12 +24,16 @@ __export(index_exports, {
24
24
  andThenAsync: () => andThenAsync,
25
25
  catchError: () => catchError,
26
26
  catchErrorAsync: () => catchErrorAsync,
27
+ deserializeResult: () => deserializeResult,
27
28
  errorUnkown: () => errorUnkown,
28
29
  errorWithCode: () => errorWithCode,
30
+ isResult: () => isResult,
29
31
  makeSafePromise: () => makeSafePromise,
30
32
  resultError: () => resultError,
31
33
  resultSuccess: () => resultSuccess,
32
34
  resultSuccessVoid: () => resultSuccessVoid,
35
+ serializeResult: () => serializeResult,
36
+ unwrapOrThrow: () => unwrapOrThrow,
33
37
  unwrapSuccessResult: () => unwrapSuccessResult
34
38
  });
35
39
  module.exports = __toCommonJS(index_exports);
@@ -76,6 +80,15 @@ var ResultSuccessImp = class {
76
80
  constructor(value) {
77
81
  this.value = value;
78
82
  }
83
+ getValueUnsafe() {
84
+ return this.value;
85
+ }
86
+ getErrorUnsafe() {
87
+ throw new Error("This result is success, cannot get error");
88
+ }
89
+ isSuccess() {
90
+ return true;
91
+ }
79
92
  andThen(f) {
80
93
  return f(this.value);
81
94
  }
@@ -96,6 +109,15 @@ var ResultErrorImp = class {
96
109
  constructor(error) {
97
110
  this.error = error;
98
111
  }
112
+ getValueUnsafe() {
113
+ throw new Error("This result is error, cannot get value");
114
+ }
115
+ getErrorUnsafe() {
116
+ return this.error;
117
+ }
118
+ isSuccess() {
119
+ return false;
120
+ }
99
121
  andThen(_f) {
100
122
  return this;
101
123
  }
@@ -132,18 +154,61 @@ function catchError(callback) {
132
154
  function catchErrorAsync(callback) {
133
155
  return (result) => result.catchErrorAsync(callback);
134
156
  }
157
+ function unwrapOrThrow(result) {
158
+ return result.unwrapOrThrow();
159
+ }
160
+
161
+ // src/result-serialization.ts
162
+ function serializeResult(value) {
163
+ const unsafeResult = value;
164
+ if (unsafeResult.isSuccess()) {
165
+ return {
166
+ type: "ts-result",
167
+ isSuccess: true,
168
+ data: unsafeResult.getValueUnsafe()
169
+ };
170
+ } else {
171
+ return {
172
+ type: "ts-result",
173
+ isSuccess: false,
174
+ data: unsafeResult.getErrorUnsafe()
175
+ };
176
+ }
177
+ }
178
+ function isValueSerializedResult(value) {
179
+ return typeof value === "object" && value !== null && "type" in value && value.type === "ts-result";
180
+ }
181
+ function isResult(value) {
182
+ return typeof value === "object" && value !== null && "_type" in value && value._type === "ts-result";
183
+ }
184
+ function deserializeResult(value) {
185
+ if (!isValueSerializedResult(value)) {
186
+ throw new Error(
187
+ `Could not deserialize value as ts-result: ${JSON.stringify(value)}`
188
+ );
189
+ }
190
+ if (value.isSuccess) {
191
+ return resultSuccess(value.data);
192
+ } else {
193
+ return resultError.fromError(value.data);
194
+ }
195
+ }
135
196
  // Annotate the CommonJS export names for ESM import in node:
136
197
  0 && (module.exports = {
137
198
  andThen,
138
199
  andThenAsync,
139
200
  catchError,
140
201
  catchErrorAsync,
202
+ deserializeResult,
141
203
  errorUnkown,
142
204
  errorWithCode,
205
+ isResult,
143
206
  makeSafePromise,
144
207
  resultError,
145
208
  resultSuccess,
146
209
  resultSuccessVoid,
210
+ serializeResult,
211
+ unwrapOrThrow,
147
212
  unwrapSuccessResult
148
213
  });
149
214
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/result.ts","../src/result-functions.ts"],"sourcesContent":["export * from './result.js';\nexport * from './result-functions.js';","export interface Result<TSuccess1, TError1> {\n andThen<TResult extends Result<any, any>>(\n f: (value: TSuccess1) => TResult,\n ): Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>;\n andThenAsync<TResult extends Result<any, any>>(\n f: (value: TSuccess1) => Promise<TResult>,\n ): Promise<Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>>;\n catchError<TResult extends Result<any, any>>(\n f: (error: TError1) => TResult,\n ): Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>;\n catchErrorAsync<TResult extends Result<any, any>>(\n f: (error: TError1) => Promise<TResult>,\n ): Promise<Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>>;\n unwrapOrThrow(errorCallback?: (e: TError1) => void): TSuccess1;\n}\n\nexport function unwrapSuccessResult<T>(result: Result<T, never>): T {\n if (result instanceof ResultSuccessImp) {\n return result['value'];\n }\n throw new Error('Unreachable code. Result is an error');\n}\n\nexport type ErrorWithCode<TCode, TData = object> = { code: TCode; data: TData };\nexport function errorWithCode<TCode, TData>(\n code: TCode,\n data: TData,\n): ErrorWithCode<TCode, TData> {\n return {\n code,\n data,\n };\n}\n\nexport type ErrorUnknown = {\n code: 'unknown';\n data: { message: string };\n};\nexport function errorUnkown(message: string): ErrorUnknown {\n return {\n code: 'unknown',\n data: { message },\n };\n}\n\nexport type SuccessType<T> = T extends Result<infer S, any> ? S : never;\nexport type ErrorType<T> = T extends Result<any, infer E> ? E : never;\n\nexport type SuccessVoid = never;\n\nexport function resultSuccessVoid(): Result<SuccessVoid, never> {\n return new ResultSuccessImp<SuccessVoid>(undefined as never);\n}\n\nexport function resultSuccess<TSuccess1>(\n value: TSuccess1,\n): Result<TSuccess1, never> {\n return new ResultSuccessImp<TSuccess1>(value);\n}\n\ntype EnforceLiteral<T> = string extends T ? never : T;\n\nexport class resultError {\n public static unknown(message: string): Result<never, ErrorUnknown> {\n return new ResultErrorImp<ErrorUnknown>(errorUnkown(message));\n }\n public static withCode<TCode, TData = object>(\n code: EnforceLiteral<TCode>,\n data: TData = {} as TData,\n ): Result<never, ErrorWithCode<TCode, TData>> {\n return new ResultErrorImp<ErrorWithCode<TCode, TData>>(\n errorWithCode(code, data),\n );\n }\n public static fromError<\n TError1 extends ErrorWithCode<any, object>,\n >(error: TError1): Result<never, TError1> {\n return new ResultErrorImp<TError1>(error);\n }\n}\n\nclass ResultSuccessImp<TSuccess1> implements Result<TSuccess1, never> {\n constructor(private value: TSuccess1) {}\n\n public andThen<TSuccess2, TError2>(\n f: (value: TSuccess1) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError2> {\n return f(this.value);\n }\n\n public async andThenAsync<TSuccess2, TError2>(\n f: (value: TSuccess1) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError2>> {\n return await f(this.value);\n }\n\n public catchError<TSuccess2, TError2>(\n _f: (error: never) => Result<TSuccess2, TError2>,\n ): Result<TSuccess1 | TSuccess2, TError2> {\n return this;\n }\n\n public async catchErrorAsync<TSuccess2, TError2>(\n _f: (error: never) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess1 | TSuccess2, TError2>> {\n return this;\n }\n\n public unwrapOrThrow(_errorCallback?: (e: never) => void): TSuccess1 {\n return this.value;\n }\n}\n\nclass ResultErrorImp<TError1> implements Result<never, TError1> {\n constructor(private error: TError1) {}\n\n public andThen<TSuccess2, TError2>(\n _f: (value: never) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError1 | TError2> {\n return this;\n }\n\n public async andThenAsync<TSuccess2, TError2>(\n _f: (value: never) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError1 | TError2>> {\n return this;\n }\n\n public catchError<TSuccess2, TError2>(\n f: (error: TError1) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError2> {\n return f(this.error);\n }\n\n public async catchErrorAsync<TSuccess2, TError2>(\n f: (error: TError1) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError2>> {\n return await f(this.error);\n }\n\n public unwrapOrThrow(errorCallback?: (e: TError1) => void): never {\n if (errorCallback !== undefined) {\n errorCallback(this.error);\n }\n throw this.error;\n }\n}\n\nexport type UnwrapErrorFromResult<T> =\n T extends Result<any, infer U> ? U : never;\n\nexport function makeSafePromise<T>(\n promise: Promise<T>,\n): Promise<Result<T, ErrorUnknown>> {\n return promise\n .then((value) => resultSuccess(value))\n .catch((error) => resultError.unknown(error.message));\n}","import { ErrorType, Result, SuccessType } from \"./result.js\";\n\nexport function andThen<TSuccess, TError, TResult extends Result<any, any>>(\n callback: (value: TSuccess) => TResult\n): (\n result: Result<TSuccess, TError>\n) => Result<SuccessType<TResult>, TError | ErrorType<TResult>> {\n return (result) => result.andThen(callback);\n}\n\nexport function andThenAsync<\n TSuccess,\n TError,\n TResult extends Result<any, any>\n>(\n callback: (value: TSuccess) => Promise<TResult>\n): (\n result: Result<TSuccess, TError>\n) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>> {\n return (result) => result.andThenAsync(callback);\n}\n\nexport function catchError<TSuccess, TError, TResult extends Result<any, any>>(\n callback: (error: TError) => TResult\n): (\n result: Result<TSuccess, TError>\n) => Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>> {\n return (result) => result.catchError(callback);\n}\n\nexport function catchErrorAsync<\n TSuccess,\n TError,\n TResult extends Result<any, any>\n>(\n callback: (error: TError) => Promise<TResult>\n): (\n result: Result<TSuccess, TError>\n) => Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>> {\n return (result) => result.catchErrorAsync(callback);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;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,UAEZ,OAAwC;AACxC,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;;;AC3JO,SAAS,QACd,UAG6D;AAC7D,SAAO,CAAC,WAAW,OAAO,QAAQ,QAAQ;AAC5C;AAEO,SAAS,aAKd,UAGsE;AACtE,SAAO,CAAC,WAAW,OAAO,aAAa,QAAQ;AACjD;AAEO,SAAS,WACd,UAG+D;AAC/D,SAAO,CAAC,WAAW,OAAO,WAAW,QAAQ;AAC/C;AAEO,SAAS,gBAKd,UAGwE;AACxE,SAAO,CAAC,WAAW,OAAO,gBAAgB,QAAQ;AACpD;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/result.ts","../src/result-functions.ts","../src/result-serialization.ts"],"sourcesContent":["export * from \"./result.js\";\nexport * from \"./result-functions.js\";\nexport * from \"./result-serialization.js\";\n","export interface Result<TSuccess, TError> {\n isSuccess(): boolean;\n andThen<TResult extends Result<any, any>>(\n f: (value: TSuccess) => TResult,\n ): Result<SuccessType<TResult>, TError | ErrorType<TResult>>;\n andThenAsync<TResult extends Result<any, any>>(\n f: (value: TSuccess) => Promise<TResult>,\n ): Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>>;\n catchError<TResult extends Result<any, any>>(\n f: (error: TError) => TResult,\n ): Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>;\n catchErrorAsync<TResult extends Result<any, any>>(\n f: (error: TError) => Promise<TResult>,\n ): Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;\n unwrapOrThrow(errorCallback?: (e: TError) => void): TSuccess;\n}\n\nexport interface UnsafeResult<TSuccess, TError> extends Result<\n TSuccess,\n TError\n> {\n getValueUnsafe(): TSuccess;\n getErrorUnsafe(): TError;\n}\n\nexport function unwrapSuccessResult<T>(result: Result<T, never>): T {\n if (result instanceof ResultSuccessImp) {\n return result[\"value\"];\n }\n throw new Error(\"Unreachable code. Result is an error\");\n}\n\nexport type ErrorWithCode<TCode, TData = object> = { code: TCode; data: TData };\nexport function errorWithCode<TCode, TData>(\n code: TCode,\n data: TData,\n): ErrorWithCode<TCode, TData> {\n return {\n code,\n data,\n };\n}\n\nexport type ErrorUnknown = {\n code: \"unknown\";\n data: { message: string };\n};\nexport function errorUnkown(message: string): ErrorUnknown {\n return {\n code: \"unknown\",\n data: { message },\n };\n}\n\nexport type SuccessType<T> = T extends Result<infer S, any> ? S : never;\nexport type ErrorType<T> = T extends Result<any, infer E> ? E : never;\n\nexport type SuccessVoid = never;\n\nexport function resultSuccessVoid(): Result<SuccessVoid, never> {\n return new ResultSuccessImp<SuccessVoid>(undefined as never);\n}\n\nexport function resultSuccess<TSuccess1>(\n value: TSuccess1,\n): Result<TSuccess1, never> {\n return new ResultSuccessImp<TSuccess1>(value);\n}\n\ntype EnforceLiteral<T> = string extends T ? never : T;\n\nexport class resultError {\n public static unknown(message: string): Result<never, ErrorUnknown> {\n return new ResultErrorImp<ErrorUnknown>(errorUnkown(message));\n }\n public static withCode<TCode, TData = object>(\n code: EnforceLiteral<TCode>,\n data: TData = {} as TData,\n ): Result<never, ErrorWithCode<TCode, TData>> {\n return new ResultErrorImp<ErrorWithCode<TCode, TData>>(\n errorWithCode(code, data),\n );\n }\n public static fromError<TError1 extends ErrorWithCode<any, object>>(\n error: TError1,\n ): Result<never, TError1> {\n return new ResultErrorImp<TError1>(error);\n }\n}\n\nclass ResultSuccessImp<TSuccess1> implements UnsafeResult<TSuccess1, never> {\n constructor(private value: TSuccess1) {}\n\n public getValueUnsafe(): TSuccess1 {\n return this.value;\n }\n public getErrorUnsafe(): never {\n throw new Error(\"This result is success, cannot get error\");\n }\n\n public isSuccess() {\n return true;\n }\n\n public andThen<TSuccess2, TError2>(\n f: (value: TSuccess1) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError2> {\n return f(this.value);\n }\n\n public async andThenAsync<TSuccess2, TError2>(\n f: (value: TSuccess1) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError2>> {\n return await f(this.value);\n }\n\n public catchError<TSuccess2, TError2>(\n _f: (error: never) => Result<TSuccess2, TError2>,\n ): Result<TSuccess1 | TSuccess2, TError2> {\n return this;\n }\n\n public async catchErrorAsync<TSuccess2, TError2>(\n _f: (error: never) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess1 | TSuccess2, TError2>> {\n return this;\n }\n\n public unwrapOrThrow(_errorCallback?: (e: never) => void): TSuccess1 {\n return this.value;\n }\n}\n\nclass ResultErrorImp<TError1> implements UnsafeResult<never, TError1> {\n constructor(private error: TError1) {}\n\n public getValueUnsafe(): never {\n throw new Error(\"This result is error, cannot get value\");\n }\n public getErrorUnsafe(): TError1 {\n return this.error;\n }\n\n public isSuccess(): boolean {\n return false;\n }\n\n public andThen<TSuccess2, TError2>(\n _f: (value: never) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError1 | TError2> {\n return this;\n }\n\n public async andThenAsync<TSuccess2, TError2>(\n _f: (value: never) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError1 | TError2>> {\n return this;\n }\n\n public catchError<TSuccess2, TError2>(\n f: (error: TError1) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError2> {\n return f(this.error);\n }\n\n public async catchErrorAsync<TSuccess2, TError2>(\n f: (error: TError1) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError2>> {\n return await f(this.error);\n }\n\n public unwrapOrThrow(errorCallback?: (e: TError1) => void): never {\n if (errorCallback !== undefined) {\n errorCallback(this.error);\n }\n throw this.error;\n }\n}\n\nexport type UnwrapErrorFromResult<T> =\n T extends Result<any, infer U> ? U : never;\n\nexport function makeSafePromise<T>(\n promise: Promise<T>,\n): Promise<Result<T, ErrorUnknown>> {\n return promise\n .then((value) => resultSuccess(value))\n .catch((error) => resultError.unknown(error.message));\n}\n","import { ErrorType, Result, SuccessType } from \"./result.js\";\n\nexport function andThen<TSuccess, TError, TResult extends Result<any, any>>(\n callback: (value: TSuccess) => TResult,\n): (\n result: Result<TSuccess, TError>,\n) => Result<SuccessType<TResult>, TError | ErrorType<TResult>> {\n return (result) => result.andThen(callback);\n}\n\nexport function andThenAsync<\n TSuccess,\n TError,\n TResult extends Result<any, any>,\n>(\n callback: (value: TSuccess) => Promise<TResult>,\n): (\n result: Result<TSuccess, TError>,\n) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>> {\n return (result) => result.andThenAsync(callback);\n}\n\nexport function catchError<TSuccess, TError, TResult extends Result<any, any>>(\n callback: (error: TError) => TResult,\n): (\n result: Result<TSuccess, TError>,\n) => Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>> {\n return (result) => result.catchError(callback);\n}\n\nexport function catchErrorAsync<\n TSuccess,\n TError,\n TResult extends Result<any, any>,\n>(\n callback: (error: TError) => Promise<TResult>,\n): (\n result: Result<TSuccess, TError>,\n) => Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>> {\n return (result) => result.catchErrorAsync(callback);\n}\n\nexport function unwrapOrThrow<TSuccess>(\n result: Result<TSuccess, never>,\n): TSuccess {\n return result.unwrapOrThrow();\n}\n","import { Result, resultError, resultSuccess, UnsafeResult } from \"./result.js\";\n\nexport type SerializedResult = {\n type: \"ts-result\";\n isSuccess: boolean;\n data: any;\n};\n\nexport function serializeResult<TSuccess, TError>(\n value: Result<TSuccess, TError>,\n): SerializedResult {\n const unsafeResult = value as UnsafeResult<TSuccess, TError>;\n if (unsafeResult.isSuccess()) {\n return {\n type: \"ts-result\",\n isSuccess: true,\n data: unsafeResult.getValueUnsafe(),\n };\n } else {\n return {\n type: \"ts-result\",\n isSuccess: false,\n data: unsafeResult.getErrorUnsafe(),\n };\n }\n}\n\nfunction isValueSerializedResult(value: unknown): value is SerializedResult {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"type\" in value &&\n value.type === \"ts-result\"\n );\n}\n\nexport function isResult(value: unknown): value is Result<unknown, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_type\" in value &&\n value._type === \"ts-result\"\n );\n}\n\nexport function deserializeResult(value: unknown) {\n if (!isValueSerializedResult(value)) {\n throw new Error(\n `Could not deserialize value as ts-result: ${JSON.stringify(value)}`,\n );\n }\n\n if (value.isSuccess) {\n return resultSuccess(value.data);\n } else {\n return resultError.fromError(value.data);\n }\n}\n"],"mappings":"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","names":[]}
package/dist/index.d.cts CHANGED
@@ -1,3 +1,4 @@
1
- export * from './result.js';
2
- export * from './result-functions.js';
1
+ export * from "./result.js";
2
+ export * from "./result-functions.js";
3
+ export * from "./result-serialization.js";
3
4
  //# sourceMappingURL=index.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- export * from './result.js';
2
- export * from './result-functions.js';
1
+ export * from "./result.js";
2
+ export * from "./result-functions.js";
3
+ export * from "./result-serialization.js";
3
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC;AAC5B,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC"}
package/dist/index.js CHANGED
@@ -40,6 +40,15 @@ var ResultSuccessImp = class {
40
40
  constructor(value) {
41
41
  this.value = value;
42
42
  }
43
+ getValueUnsafe() {
44
+ return this.value;
45
+ }
46
+ getErrorUnsafe() {
47
+ throw new Error("This result is success, cannot get error");
48
+ }
49
+ isSuccess() {
50
+ return true;
51
+ }
43
52
  andThen(f) {
44
53
  return f(this.value);
45
54
  }
@@ -60,6 +69,15 @@ var ResultErrorImp = class {
60
69
  constructor(error) {
61
70
  this.error = error;
62
71
  }
72
+ getValueUnsafe() {
73
+ throw new Error("This result is error, cannot get value");
74
+ }
75
+ getErrorUnsafe() {
76
+ return this.error;
77
+ }
78
+ isSuccess() {
79
+ return false;
80
+ }
63
81
  andThen(_f) {
64
82
  return this;
65
83
  }
@@ -96,17 +114,60 @@ function catchError(callback) {
96
114
  function catchErrorAsync(callback) {
97
115
  return (result) => result.catchErrorAsync(callback);
98
116
  }
117
+ function unwrapOrThrow(result) {
118
+ return result.unwrapOrThrow();
119
+ }
120
+
121
+ // src/result-serialization.ts
122
+ function serializeResult(value) {
123
+ const unsafeResult = value;
124
+ if (unsafeResult.isSuccess()) {
125
+ return {
126
+ type: "ts-result",
127
+ isSuccess: true,
128
+ data: unsafeResult.getValueUnsafe()
129
+ };
130
+ } else {
131
+ return {
132
+ type: "ts-result",
133
+ isSuccess: false,
134
+ data: unsafeResult.getErrorUnsafe()
135
+ };
136
+ }
137
+ }
138
+ function isValueSerializedResult(value) {
139
+ return typeof value === "object" && value !== null && "type" in value && value.type === "ts-result";
140
+ }
141
+ function isResult(value) {
142
+ return typeof value === "object" && value !== null && "_type" in value && value._type === "ts-result";
143
+ }
144
+ function deserializeResult(value) {
145
+ if (!isValueSerializedResult(value)) {
146
+ throw new Error(
147
+ `Could not deserialize value as ts-result: ${JSON.stringify(value)}`
148
+ );
149
+ }
150
+ if (value.isSuccess) {
151
+ return resultSuccess(value.data);
152
+ } else {
153
+ return resultError.fromError(value.data);
154
+ }
155
+ }
99
156
  export {
100
157
  andThen,
101
158
  andThenAsync,
102
159
  catchError,
103
160
  catchErrorAsync,
161
+ deserializeResult,
104
162
  errorUnkown,
105
163
  errorWithCode,
164
+ isResult,
106
165
  makeSafePromise,
107
166
  resultError,
108
167
  resultSuccess,
109
168
  resultSuccessVoid,
169
+ serializeResult,
170
+ unwrapOrThrow,
110
171
  unwrapSuccessResult
111
172
  };
112
173
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/result.ts","../src/result-functions.ts"],"sourcesContent":["export interface Result<TSuccess1, TError1> {\n andThen<TResult extends Result<any, any>>(\n f: (value: TSuccess1) => TResult,\n ): Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>;\n andThenAsync<TResult extends Result<any, any>>(\n f: (value: TSuccess1) => Promise<TResult>,\n ): Promise<Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>>;\n catchError<TResult extends Result<any, any>>(\n f: (error: TError1) => TResult,\n ): Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>;\n catchErrorAsync<TResult extends Result<any, any>>(\n f: (error: TError1) => Promise<TResult>,\n ): Promise<Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>>;\n unwrapOrThrow(errorCallback?: (e: TError1) => void): TSuccess1;\n}\n\nexport function unwrapSuccessResult<T>(result: Result<T, never>): T {\n if (result instanceof ResultSuccessImp) {\n return result['value'];\n }\n throw new Error('Unreachable code. Result is an error');\n}\n\nexport type ErrorWithCode<TCode, TData = object> = { code: TCode; data: TData };\nexport function errorWithCode<TCode, TData>(\n code: TCode,\n data: TData,\n): ErrorWithCode<TCode, TData> {\n return {\n code,\n data,\n };\n}\n\nexport type ErrorUnknown = {\n code: 'unknown';\n data: { message: string };\n};\nexport function errorUnkown(message: string): ErrorUnknown {\n return {\n code: 'unknown',\n data: { message },\n };\n}\n\nexport type SuccessType<T> = T extends Result<infer S, any> ? S : never;\nexport type ErrorType<T> = T extends Result<any, infer E> ? E : never;\n\nexport type SuccessVoid = never;\n\nexport function resultSuccessVoid(): Result<SuccessVoid, never> {\n return new ResultSuccessImp<SuccessVoid>(undefined as never);\n}\n\nexport function resultSuccess<TSuccess1>(\n value: TSuccess1,\n): Result<TSuccess1, never> {\n return new ResultSuccessImp<TSuccess1>(value);\n}\n\ntype EnforceLiteral<T> = string extends T ? never : T;\n\nexport class resultError {\n public static unknown(message: string): Result<never, ErrorUnknown> {\n return new ResultErrorImp<ErrorUnknown>(errorUnkown(message));\n }\n public static withCode<TCode, TData = object>(\n code: EnforceLiteral<TCode>,\n data: TData = {} as TData,\n ): Result<never, ErrorWithCode<TCode, TData>> {\n return new ResultErrorImp<ErrorWithCode<TCode, TData>>(\n errorWithCode(code, data),\n );\n }\n public static fromError<\n TError1 extends ErrorWithCode<any, object>,\n >(error: TError1): Result<never, TError1> {\n return new ResultErrorImp<TError1>(error);\n }\n}\n\nclass ResultSuccessImp<TSuccess1> implements Result<TSuccess1, never> {\n constructor(private value: TSuccess1) {}\n\n public andThen<TSuccess2, TError2>(\n f: (value: TSuccess1) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError2> {\n return f(this.value);\n }\n\n public async andThenAsync<TSuccess2, TError2>(\n f: (value: TSuccess1) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError2>> {\n return await f(this.value);\n }\n\n public catchError<TSuccess2, TError2>(\n _f: (error: never) => Result<TSuccess2, TError2>,\n ): Result<TSuccess1 | TSuccess2, TError2> {\n return this;\n }\n\n public async catchErrorAsync<TSuccess2, TError2>(\n _f: (error: never) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess1 | TSuccess2, TError2>> {\n return this;\n }\n\n public unwrapOrThrow(_errorCallback?: (e: never) => void): TSuccess1 {\n return this.value;\n }\n}\n\nclass ResultErrorImp<TError1> implements Result<never, TError1> {\n constructor(private error: TError1) {}\n\n public andThen<TSuccess2, TError2>(\n _f: (value: never) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError1 | TError2> {\n return this;\n }\n\n public async andThenAsync<TSuccess2, TError2>(\n _f: (value: never) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError1 | TError2>> {\n return this;\n }\n\n public catchError<TSuccess2, TError2>(\n f: (error: TError1) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError2> {\n return f(this.error);\n }\n\n public async catchErrorAsync<TSuccess2, TError2>(\n f: (error: TError1) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError2>> {\n return await f(this.error);\n }\n\n public unwrapOrThrow(errorCallback?: (e: TError1) => void): never {\n if (errorCallback !== undefined) {\n errorCallback(this.error);\n }\n throw this.error;\n }\n}\n\nexport type UnwrapErrorFromResult<T> =\n T extends Result<any, infer U> ? U : never;\n\nexport function makeSafePromise<T>(\n promise: Promise<T>,\n): Promise<Result<T, ErrorUnknown>> {\n return promise\n .then((value) => resultSuccess(value))\n .catch((error) => resultError.unknown(error.message));\n}","import { ErrorType, Result, SuccessType } from \"./result.js\";\n\nexport function andThen<TSuccess, TError, TResult extends Result<any, any>>(\n callback: (value: TSuccess) => TResult\n): (\n result: Result<TSuccess, TError>\n) => Result<SuccessType<TResult>, TError | ErrorType<TResult>> {\n return (result) => result.andThen(callback);\n}\n\nexport function andThenAsync<\n TSuccess,\n TError,\n TResult extends Result<any, any>\n>(\n callback: (value: TSuccess) => Promise<TResult>\n): (\n result: Result<TSuccess, TError>\n) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>> {\n return (result) => result.andThenAsync(callback);\n}\n\nexport function catchError<TSuccess, TError, TResult extends Result<any, any>>(\n callback: (error: TError) => TResult\n): (\n result: Result<TSuccess, TError>\n) => Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>> {\n return (result) => result.catchError(callback);\n}\n\nexport function catchErrorAsync<\n TSuccess,\n TError,\n TResult extends Result<any, any>\n>(\n callback: (error: TError) => Promise<TResult>\n): (\n result: Result<TSuccess, TError>\n) => Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>> {\n return (result) => result.catchErrorAsync(callback);\n}\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,UAEZ,OAAwC;AACxC,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;;;AC3JO,SAAS,QACd,UAG6D;AAC7D,SAAO,CAAC,WAAW,OAAO,QAAQ,QAAQ;AAC5C;AAEO,SAAS,aAKd,UAGsE;AACtE,SAAO,CAAC,WAAW,OAAO,aAAa,QAAQ;AACjD;AAEO,SAAS,WACd,UAG+D;AAC/D,SAAO,CAAC,WAAW,OAAO,WAAW,QAAQ;AAC/C;AAEO,SAAS,gBAKd,UAGwE;AACxE,SAAO,CAAC,WAAW,OAAO,gBAAgB,QAAQ;AACpD;","names":[]}
1
+ {"version":3,"sources":["../src/result.ts","../src/result-functions.ts","../src/result-serialization.ts"],"sourcesContent":["export interface Result<TSuccess, TError> {\n isSuccess(): boolean;\n andThen<TResult extends Result<any, any>>(\n f: (value: TSuccess) => TResult,\n ): Result<SuccessType<TResult>, TError | ErrorType<TResult>>;\n andThenAsync<TResult extends Result<any, any>>(\n f: (value: TSuccess) => Promise<TResult>,\n ): Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>>;\n catchError<TResult extends Result<any, any>>(\n f: (error: TError) => TResult,\n ): Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>;\n catchErrorAsync<TResult extends Result<any, any>>(\n f: (error: TError) => Promise<TResult>,\n ): Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;\n unwrapOrThrow(errorCallback?: (e: TError) => void): TSuccess;\n}\n\nexport interface UnsafeResult<TSuccess, TError> extends Result<\n TSuccess,\n TError\n> {\n getValueUnsafe(): TSuccess;\n getErrorUnsafe(): TError;\n}\n\nexport function unwrapSuccessResult<T>(result: Result<T, never>): T {\n if (result instanceof ResultSuccessImp) {\n return result[\"value\"];\n }\n throw new Error(\"Unreachable code. Result is an error\");\n}\n\nexport type ErrorWithCode<TCode, TData = object> = { code: TCode; data: TData };\nexport function errorWithCode<TCode, TData>(\n code: TCode,\n data: TData,\n): ErrorWithCode<TCode, TData> {\n return {\n code,\n data,\n };\n}\n\nexport type ErrorUnknown = {\n code: \"unknown\";\n data: { message: string };\n};\nexport function errorUnkown(message: string): ErrorUnknown {\n return {\n code: \"unknown\",\n data: { message },\n };\n}\n\nexport type SuccessType<T> = T extends Result<infer S, any> ? S : never;\nexport type ErrorType<T> = T extends Result<any, infer E> ? E : never;\n\nexport type SuccessVoid = never;\n\nexport function resultSuccessVoid(): Result<SuccessVoid, never> {\n return new ResultSuccessImp<SuccessVoid>(undefined as never);\n}\n\nexport function resultSuccess<TSuccess1>(\n value: TSuccess1,\n): Result<TSuccess1, never> {\n return new ResultSuccessImp<TSuccess1>(value);\n}\n\ntype EnforceLiteral<T> = string extends T ? never : T;\n\nexport class resultError {\n public static unknown(message: string): Result<never, ErrorUnknown> {\n return new ResultErrorImp<ErrorUnknown>(errorUnkown(message));\n }\n public static withCode<TCode, TData = object>(\n code: EnforceLiteral<TCode>,\n data: TData = {} as TData,\n ): Result<never, ErrorWithCode<TCode, TData>> {\n return new ResultErrorImp<ErrorWithCode<TCode, TData>>(\n errorWithCode(code, data),\n );\n }\n public static fromError<TError1 extends ErrorWithCode<any, object>>(\n error: TError1,\n ): Result<never, TError1> {\n return new ResultErrorImp<TError1>(error);\n }\n}\n\nclass ResultSuccessImp<TSuccess1> implements UnsafeResult<TSuccess1, never> {\n constructor(private value: TSuccess1) {}\n\n public getValueUnsafe(): TSuccess1 {\n return this.value;\n }\n public getErrorUnsafe(): never {\n throw new Error(\"This result is success, cannot get error\");\n }\n\n public isSuccess() {\n return true;\n }\n\n public andThen<TSuccess2, TError2>(\n f: (value: TSuccess1) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError2> {\n return f(this.value);\n }\n\n public async andThenAsync<TSuccess2, TError2>(\n f: (value: TSuccess1) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError2>> {\n return await f(this.value);\n }\n\n public catchError<TSuccess2, TError2>(\n _f: (error: never) => Result<TSuccess2, TError2>,\n ): Result<TSuccess1 | TSuccess2, TError2> {\n return this;\n }\n\n public async catchErrorAsync<TSuccess2, TError2>(\n _f: (error: never) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess1 | TSuccess2, TError2>> {\n return this;\n }\n\n public unwrapOrThrow(_errorCallback?: (e: never) => void): TSuccess1 {\n return this.value;\n }\n}\n\nclass ResultErrorImp<TError1> implements UnsafeResult<never, TError1> {\n constructor(private error: TError1) {}\n\n public getValueUnsafe(): never {\n throw new Error(\"This result is error, cannot get value\");\n }\n public getErrorUnsafe(): TError1 {\n return this.error;\n }\n\n public isSuccess(): boolean {\n return false;\n }\n\n public andThen<TSuccess2, TError2>(\n _f: (value: never) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError1 | TError2> {\n return this;\n }\n\n public async andThenAsync<TSuccess2, TError2>(\n _f: (value: never) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError1 | TError2>> {\n return this;\n }\n\n public catchError<TSuccess2, TError2>(\n f: (error: TError1) => Result<TSuccess2, TError2>,\n ): Result<TSuccess2, TError2> {\n return f(this.error);\n }\n\n public async catchErrorAsync<TSuccess2, TError2>(\n f: (error: TError1) => Promise<Result<TSuccess2, TError2>>,\n ): Promise<Result<TSuccess2, TError2>> {\n return await f(this.error);\n }\n\n public unwrapOrThrow(errorCallback?: (e: TError1) => void): never {\n if (errorCallback !== undefined) {\n errorCallback(this.error);\n }\n throw this.error;\n }\n}\n\nexport type UnwrapErrorFromResult<T> =\n T extends Result<any, infer U> ? U : never;\n\nexport function makeSafePromise<T>(\n promise: Promise<T>,\n): Promise<Result<T, ErrorUnknown>> {\n return promise\n .then((value) => resultSuccess(value))\n .catch((error) => resultError.unknown(error.message));\n}\n","import { ErrorType, Result, SuccessType } from \"./result.js\";\n\nexport function andThen<TSuccess, TError, TResult extends Result<any, any>>(\n callback: (value: TSuccess) => TResult,\n): (\n result: Result<TSuccess, TError>,\n) => Result<SuccessType<TResult>, TError | ErrorType<TResult>> {\n return (result) => result.andThen(callback);\n}\n\nexport function andThenAsync<\n TSuccess,\n TError,\n TResult extends Result<any, any>,\n>(\n callback: (value: TSuccess) => Promise<TResult>,\n): (\n result: Result<TSuccess, TError>,\n) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>> {\n return (result) => result.andThenAsync(callback);\n}\n\nexport function catchError<TSuccess, TError, TResult extends Result<any, any>>(\n callback: (error: TError) => TResult,\n): (\n result: Result<TSuccess, TError>,\n) => Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>> {\n return (result) => result.catchError(callback);\n}\n\nexport function catchErrorAsync<\n TSuccess,\n TError,\n TResult extends Result<any, any>,\n>(\n callback: (error: TError) => Promise<TResult>,\n): (\n result: Result<TSuccess, TError>,\n) => Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>> {\n return (result) => result.catchErrorAsync(callback);\n}\n\nexport function unwrapOrThrow<TSuccess>(\n result: Result<TSuccess, never>,\n): TSuccess {\n return result.unwrapOrThrow();\n}\n","import { Result, resultError, resultSuccess, UnsafeResult } from \"./result.js\";\n\nexport type SerializedResult = {\n type: \"ts-result\";\n isSuccess: boolean;\n data: any;\n};\n\nexport function serializeResult<TSuccess, TError>(\n value: Result<TSuccess, TError>,\n): SerializedResult {\n const unsafeResult = value as UnsafeResult<TSuccess, TError>;\n if (unsafeResult.isSuccess()) {\n return {\n type: \"ts-result\",\n isSuccess: true,\n data: unsafeResult.getValueUnsafe(),\n };\n } else {\n return {\n type: \"ts-result\",\n isSuccess: false,\n data: unsafeResult.getErrorUnsafe(),\n };\n }\n}\n\nfunction isValueSerializedResult(value: unknown): value is SerializedResult {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"type\" in value &&\n value.type === \"ts-result\"\n );\n}\n\nexport function isResult(value: unknown): value is Result<unknown, unknown> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"_type\" in value &&\n value._type === \"ts-result\"\n );\n}\n\nexport function deserializeResult(value: unknown) {\n if (!isValueSerializedResult(value)) {\n throw new Error(\n `Could not deserialize value as ts-result: ${JSON.stringify(value)}`,\n );\n }\n\n if (value.isSuccess) {\n return resultSuccess(value.data);\n } else {\n return resultError.fromError(value.data);\n }\n}\n"],"mappings":"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","names":[]}
@@ -3,4 +3,5 @@ export declare function andThen<TSuccess, TError, TResult extends Result<any, an
3
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>>>;
4
4
  export declare function catchError<TSuccess, TError, TResult extends Result<any, any>>(callback: (error: TError) => TResult): (result: Result<TSuccess, TError>) => Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>;
5
5
  export declare function catchErrorAsync<TSuccess, TError, TResult extends Result<any, any>>(callback: (error: TError) => Promise<TResult>): (result: Result<TSuccess, TError>) => Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;
6
+ export declare function unwrapOrThrow<TSuccess>(result: Result<TSuccess, never>): TSuccess;
6
7
  //# sourceMappingURL=result-functions.d.cts.map
@@ -1 +1 @@
1
- {"version":3,"file":"result-functions.d.ts","sourceRoot":"","sources":["../src/result-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,GACrC,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAE7D;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EACR,MAAM,EACN,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAEhC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,GAC9C,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAEtE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3E,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GACnC,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAE/D;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EACR,MAAM,EACN,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAEhC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5C,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAExE"}
1
+ {"version":3,"file":"result-functions.d.ts","sourceRoot":"","sources":["../src/result-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,GACrC,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAE7D;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EACR,MAAM,EACN,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAEhC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,GAC9C,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAEtE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3E,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GACnC,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAE/D;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EACR,MAAM,EACN,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAEhC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5C,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAExE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EACpC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAC9B,QAAQ,CAEV"}
@@ -3,4 +3,5 @@ export declare function andThen<TSuccess, TError, TResult extends Result<any, an
3
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>>>;
4
4
  export declare function catchError<TSuccess, TError, TResult extends Result<any, any>>(callback: (error: TError) => TResult): (result: Result<TSuccess, TError>) => Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>;
5
5
  export declare function catchErrorAsync<TSuccess, TError, TResult extends Result<any, any>>(callback: (error: TError) => Promise<TResult>): (result: Result<TSuccess, TError>) => Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;
6
+ export declare function unwrapOrThrow<TSuccess>(result: Result<TSuccess, never>): TSuccess;
6
7
  //# sourceMappingURL=result-functions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"result-functions.d.ts","sourceRoot":"","sources":["../src/result-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,GACrC,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAE7D;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EACR,MAAM,EACN,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAEhC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,GAC9C,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAEtE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3E,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GACnC,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAE/D;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EACR,MAAM,EACN,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAEhC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5C,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAExE"}
1
+ {"version":3,"file":"result-functions.d.ts","sourceRoot":"","sources":["../src/result-functions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE7D,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACxE,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,GACrC,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAE7D;AAED,wBAAgB,YAAY,CAC1B,QAAQ,EACR,MAAM,EACN,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAEhC,QAAQ,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,GAC9C,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAEtE;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3E,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GACnC,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAE/D;AAED,wBAAgB,eAAe,CAC7B,QAAQ,EACR,MAAM,EACN,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAEhC,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GAC5C,CACD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAC7B,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAExE;AAED,wBAAgB,aAAa,CAAC,QAAQ,EACpC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAC9B,QAAQ,CAEV"}
@@ -0,0 +1,10 @@
1
+ import { Result } from "./result.js";
2
+ export type SerializedResult = {
3
+ type: "ts-result";
4
+ isSuccess: boolean;
5
+ data: any;
6
+ };
7
+ export declare function serializeResult<TSuccess, TError>(value: Result<TSuccess, TError>): SerializedResult;
8
+ export declare function isResult(value: unknown): value is Result<unknown, unknown>;
9
+ export declare function deserializeResult(value: unknown): Result<any, never> | Result<never, any>;
10
+ //# sourceMappingURL=result-serialization.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-serialization.d.ts","sourceRoot":"","sources":["../src/result-serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA4C,MAAM,aAAa,CAAC;AAE/E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAEF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAC9C,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAC9B,gBAAgB,CAelB;AAWD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAO1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,2CAY/C"}
@@ -0,0 +1,10 @@
1
+ import { Result } from "./result.js";
2
+ export type SerializedResult = {
3
+ type: "ts-result";
4
+ isSuccess: boolean;
5
+ data: any;
6
+ };
7
+ export declare function serializeResult<TSuccess, TError>(value: Result<TSuccess, TError>): SerializedResult;
8
+ export declare function isResult(value: unknown): value is Result<unknown, unknown>;
9
+ export declare function deserializeResult(value: unknown): Result<any, never> | Result<never, any>;
10
+ //# sourceMappingURL=result-serialization.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"result-serialization.d.ts","sourceRoot":"","sources":["../src/result-serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA4C,MAAM,aAAa,CAAC;AAE/E,MAAM,MAAM,gBAAgB,GAAG;IAC7B,IAAI,EAAE,WAAW,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;IACnB,IAAI,EAAE,GAAG,CAAC;CACX,CAAC;AAEF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAC9C,KAAK,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,GAC9B,gBAAgB,CAelB;AAWD,wBAAgB,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,CAO1E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,OAAO,2CAY/C"}
package/dist/result.d.cts CHANGED
@@ -1,9 +1,14 @@
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;
1
+ export interface Result<TSuccess, TError> {
2
+ isSuccess(): boolean;
3
+ andThen<TResult extends Result<any, any>>(f: (value: TSuccess) => TResult): Result<SuccessType<TResult>, TError | ErrorType<TResult>>;
4
+ andThenAsync<TResult extends Result<any, any>>(f: (value: TSuccess) => Promise<TResult>): Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>>;
5
+ catchError<TResult extends Result<any, any>>(f: (error: TError) => TResult): Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>;
6
+ catchErrorAsync<TResult extends Result<any, any>>(f: (error: TError) => Promise<TResult>): Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;
7
+ unwrapOrThrow(errorCallback?: (e: TError) => void): TSuccess;
8
+ }
9
+ export interface UnsafeResult<TSuccess, TError> extends Result<TSuccess, TError> {
10
+ getValueUnsafe(): TSuccess;
11
+ getErrorUnsafe(): TError;
7
12
  }
8
13
  export declare function unwrapSuccessResult<T>(result: Result<T, never>): T;
9
14
  export type ErrorWithCode<TCode, TData = object> = {
@@ -12,7 +17,7 @@ export type ErrorWithCode<TCode, TData = object> = {
12
17
  };
13
18
  export declare function errorWithCode<TCode, TData>(code: TCode, data: TData): ErrorWithCode<TCode, TData>;
14
19
  export type ErrorUnknown = {
15
- code: 'unknown';
20
+ code: "unknown";
16
21
  data: {
17
22
  message: string;
18
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
package/dist/result.d.ts CHANGED
@@ -1,9 +1,14 @@
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;
1
+ export interface Result<TSuccess, TError> {
2
+ isSuccess(): boolean;
3
+ andThen<TResult extends Result<any, any>>(f: (value: TSuccess) => TResult): Result<SuccessType<TResult>, TError | ErrorType<TResult>>;
4
+ andThenAsync<TResult extends Result<any, any>>(f: (value: TSuccess) => Promise<TResult>): Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>>;
5
+ catchError<TResult extends Result<any, any>>(f: (error: TError) => TResult): Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>;
6
+ catchErrorAsync<TResult extends Result<any, any>>(f: (error: TError) => Promise<TResult>): Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;
7
+ unwrapOrThrow(errorCallback?: (e: TError) => void): TSuccess;
8
+ }
9
+ export interface UnsafeResult<TSuccess, TError> extends Result<TSuccess, TError> {
10
+ getValueUnsafe(): TSuccess;
11
+ getErrorUnsafe(): TError;
7
12
  }
8
13
  export declare function unwrapSuccessResult<T>(result: Result<T, never>): T;
9
14
  export type ErrorWithCode<TCode, TData = object> = {
@@ -12,7 +17,7 @@ export type ErrorWithCode<TCode, TData = object> = {
12
17
  };
13
18
  export declare function errorWithCode<TCode, TData>(code: TCode, data: TData): ErrorWithCode<TCode, TData>;
14
19
  export type ErrorUnknown = {
15
- code: 'unknown';
20
+ code: "unknown";
16
21
  data: {
17
22
  message: string;
18
23
  };
@@ -1 +1 @@
1
- {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"assert-type.d.ts","sourceRoot":"","sources":["../../../src/utils/test/assert-type.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,EAC3C,MAAM,EAAE,OAAO,SAAS,SAAS,GAAG,IAAI,GAAG,KAAK,GAC/C,IAAI,CAAG;AAEV,wBAAgB,eAAe,SAE9B"}
1
+ {"version":3,"file":"assert-type.d.ts","sourceRoot":"","sources":["../../../src/utils/test/assert-type.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,EAC3C,MAAM,EAAE,OAAO,SAAS,SAAS,GAAG,IAAI,GAAG,KAAK,GAC/C,IAAI,CAAG;AAEV,wBAAgB,eAAe,SAE9B"}
@@ -1 +1 @@
1
- {"version":3,"file":"assert-type.d.ts","sourceRoot":"","sources":["../../../src/utils/test/assert-type.ts"],"names":[],"mappings":"AAAA,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,EAC3C,MAAM,EAAE,OAAO,SAAS,SAAS,GAAG,IAAI,GAAG,KAAK,GAC/C,IAAI,CAAG;AAEV,wBAAgB,eAAe,SAE9B"}
1
+ {"version":3,"file":"assert-type.d.ts","sourceRoot":"","sources":["../../../src/utils/test/assert-type.ts"],"names":[],"mappings":"AAEA,wBAAgB,UAAU,CAAC,OAAO,EAAE,SAAS,EAC3C,MAAM,EAAE,OAAO,SAAS,SAAS,GAAG,IAAI,GAAG,KAAK,GAC/C,IAAI,CAAG;AAEV,wBAAgB,eAAe,SAE9B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@j2blasco/ts-result",
3
- "version": "0.1.12",
3
+ "version": "0.1.15",
4
4
  "description": "Result Monad for TypeScript",
5
5
  "author": "j2blasco",
6
6
  "license": "MIT",
@@ -44,16 +44,14 @@
44
44
  "build:dts": "tsc -p tsconfig.build.json && node scripts/build-maps.cjs",
45
45
  "clean": "shx rm -rf dist",
46
46
  "prepublishOnly": "npm run build",
47
- "test": "jest"
47
+ "test": "vitest --config=./vitest.config.ts run"
48
48
  },
49
49
  "type": "module",
50
50
  "devDependencies": {
51
- "@j2blasco/ts-pipe": "^0.0.8",
52
- "@types/jest": "^29.5.14",
53
- "jest": "^29.7.0",
54
- "shx": "^0.4.0",
55
- "ts-jest": "^29.3.2",
56
- "tsup": "^8.5.0",
51
+ "@j2blasco/ts-pipe": "~0.1.6",
52
+ "vitest": "~4.1.5",
53
+ "shx": "~0.4.0",
54
+ "tsup": "~8.5.0",
57
55
  "typescript": "~5.7.2"
58
56
  }
59
57
  }
package/src/index.ts CHANGED
@@ -1,2 +1,3 @@
1
- export * from './result.js';
2
- export * from './result-functions.js';
1
+ export * from "./result.js";
2
+ export * from "./result-functions.js";
3
+ export * from "./result-serialization.js";
@@ -1,8 +1,14 @@
1
- // import { asyncPipe, pipe } from "@j2blasco/ts-pipe";
2
- import { andThen, andThenAsync, catchError, catchErrorAsync } from "./result-functions.js";
1
+ import {
2
+ andThen,
3
+ andThenAsync,
4
+ catchError,
5
+ catchErrorAsync,
6
+ unwrapOrThrow,
7
+ } from "./result-functions.js";
3
8
  import { resultSuccess, resultError, ErrorUnknown, Result } from "./result.js";
4
9
  import { assertType } from "./utils/test/assert-type.js";
5
- import { asyncPipe, pipe } from "@j2blasco/ts-pipe";
10
+ import { pipeAsync, pipe } from "@j2blasco/ts-pipe";
11
+ import { describe, expect, test } from "vitest";
6
12
 
7
13
  function doSomething(): Result<string, ErrorUnknown> {
8
14
  return resultSuccess("5");
@@ -26,7 +32,7 @@ describe("Result functions", () => {
26
32
  test("andThenAsync transforms success values", async () => {
27
33
  const result = resultSuccess(5);
28
34
  const transformed = await andThenAsync(async (x: number) =>
29
- resultSuccess(x * 2)
35
+ resultSuccess(x * 2),
30
36
  )(result);
31
37
  expect(transformed.unwrapOrThrow()).toBe(10);
32
38
  });
@@ -34,7 +40,7 @@ describe("Result functions", () => {
34
40
  test("andThenAsync preserves failures", async () => {
35
41
  const result = resultError.unknown("error message");
36
42
  const transformed = await andThenAsync(async (x: any) =>
37
- resultSuccess(x * 2)
43
+ resultSuccess(x * 2),
38
44
  )(result);
39
45
 
40
46
  // Check if the transformation preserves the error by trying to unwrap
@@ -43,46 +49,52 @@ describe("Result functions", () => {
43
49
 
44
50
  test("catchError handles errors", () => {
45
51
  const result = resultError.unknown("error message");
46
- const recovered = catchError((error: ErrorUnknown) =>
47
- resultSuccess("recovered")
52
+ const recovered = catchError((error: ErrorUnknown) =>
53
+ resultSuccess("recovered"),
48
54
  )(result);
49
55
  expect(recovered.unwrapOrThrow()).toBe("recovered");
50
56
  });
51
57
 
52
58
  test("catchError preserves success values", () => {
53
59
  const result = resultSuccess(42);
54
- const recovered = catchError((error: any) =>
55
- resultSuccess("should not be called")
60
+ const recovered = catchError((error: any) =>
61
+ resultSuccess("should not be called"),
56
62
  )(result);
57
63
  expect(recovered.unwrapOrThrow()).toBe(42);
58
64
  });
59
65
 
60
66
  test("catchErrorAsync handles errors", async () => {
61
67
  const result = resultError.unknown("error message");
62
- const recovered = await catchErrorAsync(async (error: ErrorUnknown) =>
63
- resultSuccess("recovered async")
68
+ const recovered = await catchErrorAsync(async (error: ErrorUnknown) =>
69
+ resultSuccess("recovered async"),
64
70
  )(result);
65
71
  expect(recovered.unwrapOrThrow()).toBe("recovered async");
66
72
  });
67
73
 
68
74
  test("catchErrorAsync preserves success values", async () => {
69
75
  const result = resultSuccess(42);
70
- const recovered = await catchErrorAsync(async (error: any) =>
71
- resultSuccess("should not be called")
76
+ const recovered = await catchErrorAsync(async (error: any) =>
77
+ resultSuccess("should not be called"),
72
78
  )(result);
73
79
  expect(recovered.unwrapOrThrow()).toBe(42);
74
80
  });
81
+
82
+ test("unwrapOrThrow", () => {
83
+ const result = resultSuccess(42);
84
+ const value = unwrapOrThrow(result);
85
+ expect(value).toBe(42);
86
+ });
75
87
  });
76
88
 
77
89
  describe("Result integration with ts-pipe", () => {
78
- test("asyncPipe", async () => {
79
- var result = await asyncPipe(
90
+ test("pipeAsync", async () => {
91
+ var result = await pipeAsync(
80
92
  doSomething(),
81
93
  andThenAsync(async (_e) => resultSuccess(new Date())),
82
94
  andThen((r) => {
83
95
  assertType<typeof r, Date>(true);
84
96
  return resultSuccess("test");
85
- })
97
+ }),
86
98
  );
87
99
  expect(result.unwrapOrThrow()).toBe("test");
88
100
  });
@@ -94,7 +106,7 @@ describe("Result integration with ts-pipe", () => {
94
106
  andThen((r) => {
95
107
  assertType<typeof r, Date>(true);
96
108
  return resultSuccess("test");
97
- })
109
+ }),
98
110
  );
99
111
  expect(result.unwrapOrThrow()).toBe("test");
100
112
  });
@@ -106,7 +118,7 @@ describe("Result integration with ts-pipe", () => {
106
118
  andThen((r) => {
107
119
  assertType<typeof r, Date>(true);
108
120
  return resultSuccess("test");
109
- })
121
+ }),
110
122
  );
111
123
  expect(result.unwrapOrThrow()).toBe("test");
112
124
  });
@@ -1,9 +1,9 @@
1
1
  import { ErrorType, Result, SuccessType } from "./result.js";
2
2
 
3
3
  export function andThen<TSuccess, TError, TResult extends Result<any, any>>(
4
- callback: (value: TSuccess) => TResult
4
+ callback: (value: TSuccess) => TResult,
5
5
  ): (
6
- result: Result<TSuccess, TError>
6
+ result: Result<TSuccess, TError>,
7
7
  ) => Result<SuccessType<TResult>, TError | ErrorType<TResult>> {
8
8
  return (result) => result.andThen(callback);
9
9
  }
@@ -11,19 +11,19 @@ export function andThen<TSuccess, TError, TResult extends Result<any, any>>(
11
11
  export function andThenAsync<
12
12
  TSuccess,
13
13
  TError,
14
- TResult extends Result<any, any>
14
+ TResult extends Result<any, any>,
15
15
  >(
16
- callback: (value: TSuccess) => Promise<TResult>
16
+ callback: (value: TSuccess) => Promise<TResult>,
17
17
  ): (
18
- result: Result<TSuccess, TError>
18
+ result: Result<TSuccess, TError>,
19
19
  ) => Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>> {
20
20
  return (result) => result.andThenAsync(callback);
21
21
  }
22
22
 
23
23
  export function catchError<TSuccess, TError, TResult extends Result<any, any>>(
24
- callback: (error: TError) => TResult
24
+ callback: (error: TError) => TResult,
25
25
  ): (
26
- result: Result<TSuccess, TError>
26
+ result: Result<TSuccess, TError>,
27
27
  ) => Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>> {
28
28
  return (result) => result.catchError(callback);
29
29
  }
@@ -31,11 +31,17 @@ export function catchError<TSuccess, TError, TResult extends Result<any, any>>(
31
31
  export function catchErrorAsync<
32
32
  TSuccess,
33
33
  TError,
34
- TResult extends Result<any, any>
34
+ TResult extends Result<any, any>,
35
35
  >(
36
- callback: (error: TError) => Promise<TResult>
36
+ callback: (error: TError) => Promise<TResult>,
37
37
  ): (
38
- result: Result<TSuccess, TError>
38
+ result: Result<TSuccess, TError>,
39
39
  ) => Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>> {
40
40
  return (result) => result.catchErrorAsync(callback);
41
41
  }
42
+
43
+ export function unwrapOrThrow<TSuccess>(
44
+ result: Result<TSuccess, never>,
45
+ ): TSuccess {
46
+ return result.unwrapOrThrow();
47
+ }
@@ -0,0 +1,18 @@
1
+ import { describe, expect, it } from "vitest";
2
+ import { resultSuccess } from "./result";
3
+ import { deserializeResult, serializeResult } from "./result-serialization";
4
+
5
+ describe("result-serialization", () => {
6
+ it("can be serialized and deserialized", () => {
7
+ const result = resultSuccess(42);
8
+
9
+ const serializedResult = serializeResult(result);
10
+
11
+ const stringifiedResult = JSON.stringify(serializedResult);
12
+ const parsedResult = JSON.parse(stringifiedResult);
13
+ expect(typeof parsedResult.andThen).toBe("undefined");
14
+
15
+ const deserializedResult = deserializeResult(parsedResult);
16
+ expect(typeof deserializedResult.andThen).toBe("function");
17
+ });
18
+ });
@@ -0,0 +1,58 @@
1
+ import { Result, resultError, resultSuccess, UnsafeResult } from "./result.js";
2
+
3
+ export type SerializedResult = {
4
+ type: "ts-result";
5
+ isSuccess: boolean;
6
+ data: any;
7
+ };
8
+
9
+ export function serializeResult<TSuccess, TError>(
10
+ value: Result<TSuccess, TError>,
11
+ ): SerializedResult {
12
+ const unsafeResult = value as UnsafeResult<TSuccess, TError>;
13
+ if (unsafeResult.isSuccess()) {
14
+ return {
15
+ type: "ts-result",
16
+ isSuccess: true,
17
+ data: unsafeResult.getValueUnsafe(),
18
+ };
19
+ } else {
20
+ return {
21
+ type: "ts-result",
22
+ isSuccess: false,
23
+ data: unsafeResult.getErrorUnsafe(),
24
+ };
25
+ }
26
+ }
27
+
28
+ function isValueSerializedResult(value: unknown): value is SerializedResult {
29
+ return (
30
+ typeof value === "object" &&
31
+ value !== null &&
32
+ "type" in value &&
33
+ value.type === "ts-result"
34
+ );
35
+ }
36
+
37
+ export function isResult(value: unknown): value is Result<unknown, unknown> {
38
+ return (
39
+ typeof value === "object" &&
40
+ value !== null &&
41
+ "_type" in value &&
42
+ value._type === "ts-result"
43
+ );
44
+ }
45
+
46
+ export function deserializeResult(value: unknown) {
47
+ if (!isValueSerializedResult(value)) {
48
+ throw new Error(
49
+ `Could not deserialize value as ts-result: ${JSON.stringify(value)}`,
50
+ );
51
+ }
52
+
53
+ if (value.isSuccess) {
54
+ return resultSuccess(value.data);
55
+ } else {
56
+ return resultError.fromError(value.data);
57
+ }
58
+ }
@@ -1,3 +1,4 @@
1
+ import { describe, expect, test } from "vitest";
1
2
  import {
2
3
  resultSuccess,
3
4
  resultError,
@@ -7,6 +8,7 @@ import {
7
8
  resultSuccessVoid,
8
9
  SuccessVoid,
9
10
  ErrorUnknown,
11
+ UnsafeResult,
10
12
  } from "./result.js";
11
13
  import { assertType, expectToCompile } from "./utils/test/assert-type.js";
12
14
 
@@ -107,7 +109,30 @@ describe("Result Monad", () => {
107
109
  }
108
110
  return resultError.fromError(e);
109
111
  });
110
- type Expected = Result<number, ErrorUnknown | ErrorWithCode<'error-code-2'>>;
112
+ type Expected = Result<
113
+ number,
114
+ ErrorUnknown | ErrorWithCode<"error-code-2">
115
+ >;
111
116
  assertType<typeof catchedResult, Expected>(true);
112
117
  });
118
+
119
+ describe("UnsafeResult", () => {
120
+ test("returns value", () => {
121
+ const result = resultSuccess(42) as UnsafeResult<number, never>;
122
+ const value = result.getValueUnsafe();
123
+ expect(value).toBe(42);
124
+ });
125
+ test("returns error", () => {
126
+ const result = resultError.withCode("test" as const, {
127
+ value: 42,
128
+ }) as UnsafeResult<never, unknown>;
129
+ const value = result.getErrorUnsafe();
130
+ expect(value).toMatchObject({
131
+ code: "test",
132
+ data: {
133
+ value: 42,
134
+ },
135
+ });
136
+ });
137
+ });
113
138
  });
package/src/result.ts CHANGED
@@ -1,24 +1,33 @@
1
- export interface Result<TSuccess1, TError1> {
1
+ export interface Result<TSuccess, TError> {
2
+ isSuccess(): boolean;
2
3
  andThen<TResult extends Result<any, any>>(
3
- f: (value: TSuccess1) => TResult,
4
- ): Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>;
4
+ f: (value: TSuccess) => TResult,
5
+ ): Result<SuccessType<TResult>, TError | ErrorType<TResult>>;
5
6
  andThenAsync<TResult extends Result<any, any>>(
6
- f: (value: TSuccess1) => Promise<TResult>,
7
- ): Promise<Result<SuccessType<TResult>, TError1 | ErrorType<TResult>>>;
7
+ f: (value: TSuccess) => Promise<TResult>,
8
+ ): Promise<Result<SuccessType<TResult>, TError | ErrorType<TResult>>>;
8
9
  catchError<TResult extends Result<any, any>>(
9
- f: (error: TError1) => TResult,
10
- ): Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>;
10
+ f: (error: TError) => TResult,
11
+ ): Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>;
11
12
  catchErrorAsync<TResult extends Result<any, any>>(
12
- f: (error: TError1) => Promise<TResult>,
13
- ): Promise<Result<TSuccess1 | SuccessType<TResult>, ErrorType<TResult>>>;
14
- unwrapOrThrow(errorCallback?: (e: TError1) => void): TSuccess1;
13
+ f: (error: TError) => Promise<TResult>,
14
+ ): Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;
15
+ unwrapOrThrow(errorCallback?: (e: TError) => void): TSuccess;
16
+ }
17
+
18
+ export interface UnsafeResult<TSuccess, TError> extends Result<
19
+ TSuccess,
20
+ TError
21
+ > {
22
+ getValueUnsafe(): TSuccess;
23
+ getErrorUnsafe(): TError;
15
24
  }
16
25
 
17
26
  export function unwrapSuccessResult<T>(result: Result<T, never>): T {
18
27
  if (result instanceof ResultSuccessImp) {
19
- return result['value'];
28
+ return result["value"];
20
29
  }
21
- throw new Error('Unreachable code. Result is an error');
30
+ throw new Error("Unreachable code. Result is an error");
22
31
  }
23
32
 
24
33
  export type ErrorWithCode<TCode, TData = object> = { code: TCode; data: TData };
@@ -33,12 +42,12 @@ export function errorWithCode<TCode, TData>(
33
42
  }
34
43
 
35
44
  export type ErrorUnknown = {
36
- code: 'unknown';
45
+ code: "unknown";
37
46
  data: { message: string };
38
47
  };
39
48
  export function errorUnkown(message: string): ErrorUnknown {
40
49
  return {
41
- code: 'unknown',
50
+ code: "unknown",
42
51
  data: { message },
43
52
  };
44
53
  }
@@ -72,16 +81,27 @@ export class resultError {
72
81
  errorWithCode(code, data),
73
82
  );
74
83
  }
75
- public static fromError<
76
- TError1 extends ErrorWithCode<any, object>,
77
- >(error: TError1): Result<never, TError1> {
84
+ public static fromError<TError1 extends ErrorWithCode<any, object>>(
85
+ error: TError1,
86
+ ): Result<never, TError1> {
78
87
  return new ResultErrorImp<TError1>(error);
79
88
  }
80
89
  }
81
90
 
82
- class ResultSuccessImp<TSuccess1> implements Result<TSuccess1, never> {
91
+ class ResultSuccessImp<TSuccess1> implements UnsafeResult<TSuccess1, never> {
83
92
  constructor(private value: TSuccess1) {}
84
93
 
94
+ public getValueUnsafe(): TSuccess1 {
95
+ return this.value;
96
+ }
97
+ public getErrorUnsafe(): never {
98
+ throw new Error("This result is success, cannot get error");
99
+ }
100
+
101
+ public isSuccess() {
102
+ return true;
103
+ }
104
+
85
105
  public andThen<TSuccess2, TError2>(
86
106
  f: (value: TSuccess1) => Result<TSuccess2, TError2>,
87
107
  ): Result<TSuccess2, TError2> {
@@ -111,9 +131,20 @@ class ResultSuccessImp<TSuccess1> implements Result<TSuccess1, never> {
111
131
  }
112
132
  }
113
133
 
114
- class ResultErrorImp<TError1> implements Result<never, TError1> {
134
+ class ResultErrorImp<TError1> implements UnsafeResult<never, TError1> {
115
135
  constructor(private error: TError1) {}
116
136
 
137
+ public getValueUnsafe(): never {
138
+ throw new Error("This result is error, cannot get value");
139
+ }
140
+ public getErrorUnsafe(): TError1 {
141
+ return this.error;
142
+ }
143
+
144
+ public isSuccess(): boolean {
145
+ return false;
146
+ }
147
+
117
148
  public andThen<TSuccess2, TError2>(
118
149
  _f: (value: never) => Result<TSuccess2, TError2>,
119
150
  ): Result<TSuccess2, TError1 | TError2> {
@@ -155,4 +186,4 @@ export function makeSafePromise<T>(
155
186
  return promise
156
187
  .then((value) => resultSuccess(value))
157
188
  .catch((error) => resultError.unknown(error.message));
158
- }
189
+ }
@@ -1,5 +1,7 @@
1
+ import { expect } from "vitest";
2
+
1
3
  export function assertType<TActual, TExpected>(
2
- _value: TActual extends TExpected ? true : false
4
+ _value: TActual extends TExpected ? true : false,
3
5
  ): void {}
4
6
 
5
7
  export function expectToCompile() {