@j2blasco/ts-result 0.1.13 → 0.1.16
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 +44 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -2
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +41 -0
- package/dist/index.js.map +1 -1
- package/dist/result-serialization.d.cts +2 -2
- package/dist/result-serialization.d.cts.map +1 -1
- package/dist/result-serialization.d.ts +2 -2
- package/dist/result-serialization.d.ts.map +1 -1
- package/dist/result.d.cts +2 -1
- package/dist/result.d.cts.map +1 -1
- package/dist/result.d.ts +2 -1
- package/dist/result.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +3 -2
- package/src/result-serialization.test.ts +11 -2
- package/src/result-serialization.ts +12 -3
- package/src/result.ts +11 -3
package/dist/index.cjs
CHANGED
|
@@ -24,12 +24,15 @@ __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,
|
|
33
36
|
unwrapOrThrow: () => unwrapOrThrow,
|
|
34
37
|
unwrapSuccessResult: () => unwrapSuccessResult
|
|
35
38
|
});
|
|
@@ -77,6 +80,7 @@ var ResultSuccessImp = class {
|
|
|
77
80
|
constructor(value) {
|
|
78
81
|
this.value = value;
|
|
79
82
|
}
|
|
83
|
+
_type = "ts-result";
|
|
80
84
|
getValueUnsafe() {
|
|
81
85
|
return this.value;
|
|
82
86
|
}
|
|
@@ -106,6 +110,7 @@ var ResultErrorImp = class {
|
|
|
106
110
|
constructor(error) {
|
|
107
111
|
this.error = error;
|
|
108
112
|
}
|
|
113
|
+
_type = "ts-result";
|
|
109
114
|
getValueUnsafe() {
|
|
110
115
|
throw new Error("This result is error, cannot get value");
|
|
111
116
|
}
|
|
@@ -154,18 +159,57 @@ function catchErrorAsync(callback) {
|
|
|
154
159
|
function unwrapOrThrow(result) {
|
|
155
160
|
return result.unwrapOrThrow();
|
|
156
161
|
}
|
|
162
|
+
|
|
163
|
+
// src/result-serialization.ts
|
|
164
|
+
function serializeResult(value) {
|
|
165
|
+
const unsafeResult = value;
|
|
166
|
+
if (unsafeResult.isSuccess()) {
|
|
167
|
+
return {
|
|
168
|
+
type: "ts-result",
|
|
169
|
+
isSuccess: true,
|
|
170
|
+
data: unsafeResult.getValueUnsafe()
|
|
171
|
+
};
|
|
172
|
+
} else {
|
|
173
|
+
return {
|
|
174
|
+
type: "ts-result",
|
|
175
|
+
isSuccess: false,
|
|
176
|
+
data: unsafeResult.getErrorUnsafe()
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
function isValueSerializedResult(value) {
|
|
181
|
+
return typeof value === "object" && value !== null && "type" in value && value.type === "ts-result";
|
|
182
|
+
}
|
|
183
|
+
function isResult(value) {
|
|
184
|
+
return typeof value === "object" && value !== null && "_type" in value && value._type === "ts-result";
|
|
185
|
+
}
|
|
186
|
+
function deserializeResult(value) {
|
|
187
|
+
if (!isValueSerializedResult(value)) {
|
|
188
|
+
throw new Error(
|
|
189
|
+
`Could not deserialize value as ts-result: ${JSON.stringify(value)}`
|
|
190
|
+
);
|
|
191
|
+
}
|
|
192
|
+
if (value.isSuccess) {
|
|
193
|
+
return resultSuccess(value.data);
|
|
194
|
+
} else {
|
|
195
|
+
return resultError.fromError(value.data);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
157
198
|
// Annotate the CommonJS export names for ESM import in node:
|
|
158
199
|
0 && (module.exports = {
|
|
159
200
|
andThen,
|
|
160
201
|
andThenAsync,
|
|
161
202
|
catchError,
|
|
162
203
|
catchErrorAsync,
|
|
204
|
+
deserializeResult,
|
|
163
205
|
errorUnkown,
|
|
164
206
|
errorWithCode,
|
|
207
|
+
isResult,
|
|
165
208
|
makeSafePromise,
|
|
166
209
|
resultError,
|
|
167
210
|
resultSuccess,
|
|
168
211
|
resultSuccessVoid,
|
|
212
|
+
serializeResult,
|
|
169
213
|
unwrapOrThrow,
|
|
170
214
|
unwrapSuccessResult
|
|
171
215
|
});
|
package/dist/index.cjs.map
CHANGED
|
@@ -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<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"],"mappings":"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","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 ResultImplementation<TSuccess, TError> extends Result<\n TSuccess,\n TError\n> {\n _type: \"ts-result\";\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 ResultImplementation<\n TSuccess1,\n never\n> {\n public readonly _type = \"ts-result\";\n\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 ResultImplementation<never, TError1> {\n public readonly _type = \"ts-result\";\n\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, ResultImplementation } 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 ResultImplementation<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
package/dist/index.d.cts.map
CHANGED
|
@@ -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
package/dist/index.d.ts.map
CHANGED
|
@@ -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,7 @@ var ResultSuccessImp = class {
|
|
|
40
40
|
constructor(value) {
|
|
41
41
|
this.value = value;
|
|
42
42
|
}
|
|
43
|
+
_type = "ts-result";
|
|
43
44
|
getValueUnsafe() {
|
|
44
45
|
return this.value;
|
|
45
46
|
}
|
|
@@ -69,6 +70,7 @@ var ResultErrorImp = class {
|
|
|
69
70
|
constructor(error) {
|
|
70
71
|
this.error = error;
|
|
71
72
|
}
|
|
73
|
+
_type = "ts-result";
|
|
72
74
|
getValueUnsafe() {
|
|
73
75
|
throw new Error("This result is error, cannot get value");
|
|
74
76
|
}
|
|
@@ -117,17 +119,56 @@ function catchErrorAsync(callback) {
|
|
|
117
119
|
function unwrapOrThrow(result) {
|
|
118
120
|
return result.unwrapOrThrow();
|
|
119
121
|
}
|
|
122
|
+
|
|
123
|
+
// src/result-serialization.ts
|
|
124
|
+
function serializeResult(value) {
|
|
125
|
+
const unsafeResult = value;
|
|
126
|
+
if (unsafeResult.isSuccess()) {
|
|
127
|
+
return {
|
|
128
|
+
type: "ts-result",
|
|
129
|
+
isSuccess: true,
|
|
130
|
+
data: unsafeResult.getValueUnsafe()
|
|
131
|
+
};
|
|
132
|
+
} else {
|
|
133
|
+
return {
|
|
134
|
+
type: "ts-result",
|
|
135
|
+
isSuccess: false,
|
|
136
|
+
data: unsafeResult.getErrorUnsafe()
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
function isValueSerializedResult(value) {
|
|
141
|
+
return typeof value === "object" && value !== null && "type" in value && value.type === "ts-result";
|
|
142
|
+
}
|
|
143
|
+
function isResult(value) {
|
|
144
|
+
return typeof value === "object" && value !== null && "_type" in value && value._type === "ts-result";
|
|
145
|
+
}
|
|
146
|
+
function deserializeResult(value) {
|
|
147
|
+
if (!isValueSerializedResult(value)) {
|
|
148
|
+
throw new Error(
|
|
149
|
+
`Could not deserialize value as ts-result: ${JSON.stringify(value)}`
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
if (value.isSuccess) {
|
|
153
|
+
return resultSuccess(value.data);
|
|
154
|
+
} else {
|
|
155
|
+
return resultError.fromError(value.data);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
120
158
|
export {
|
|
121
159
|
andThen,
|
|
122
160
|
andThenAsync,
|
|
123
161
|
catchError,
|
|
124
162
|
catchErrorAsync,
|
|
163
|
+
deserializeResult,
|
|
125
164
|
errorUnkown,
|
|
126
165
|
errorWithCode,
|
|
166
|
+
isResult,
|
|
127
167
|
makeSafePromise,
|
|
128
168
|
resultError,
|
|
129
169
|
resultSuccess,
|
|
130
170
|
resultSuccessVoid,
|
|
171
|
+
serializeResult,
|
|
131
172
|
unwrapOrThrow,
|
|
132
173
|
unwrapSuccessResult
|
|
133
174
|
};
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/result.ts","../src/result-functions.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"],"mappings":"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","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 ResultImplementation<TSuccess, TError> extends Result<\n TSuccess,\n TError\n> {\n _type: \"ts-result\";\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 ResultImplementation<\n TSuccess1,\n never\n> {\n public readonly _type = \"ts-result\";\n\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 ResultImplementation<never, TError1> {\n public readonly _type = \"ts-result\";\n\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, ResultImplementation } 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 ResultImplementation<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":[]}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Result } from "./result.js";
|
|
2
|
-
type SerializedResult = {
|
|
2
|
+
export type SerializedResult = {
|
|
3
3
|
type: "ts-result";
|
|
4
4
|
isSuccess: boolean;
|
|
5
5
|
data: any;
|
|
6
6
|
};
|
|
7
7
|
export declare function serializeResult<TSuccess, TError>(value: Result<TSuccess, TError>): SerializedResult;
|
|
8
|
+
export declare function isResult(value: unknown): value is Result<unknown, unknown>;
|
|
8
9
|
export declare function deserializeResult(value: unknown): Result<any, never> | Result<never, any>;
|
|
9
|
-
export {};
|
|
10
10
|
//# sourceMappingURL=result-serialization.d.cts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-serialization.d.ts","sourceRoot":"","sources":["../src/result-serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"result-serialization.d.ts","sourceRoot":"","sources":["../src/result-serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoD,MAAM,aAAa,CAAC;AAEvF,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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { Result } from "./result.js";
|
|
2
|
-
type SerializedResult = {
|
|
2
|
+
export type SerializedResult = {
|
|
3
3
|
type: "ts-result";
|
|
4
4
|
isSuccess: boolean;
|
|
5
5
|
data: any;
|
|
6
6
|
};
|
|
7
7
|
export declare function serializeResult<TSuccess, TError>(value: Result<TSuccess, TError>): SerializedResult;
|
|
8
|
+
export declare function isResult(value: unknown): value is Result<unknown, unknown>;
|
|
8
9
|
export declare function deserializeResult(value: unknown): Result<any, never> | Result<never, any>;
|
|
9
|
-
export {};
|
|
10
10
|
//# sourceMappingURL=result-serialization.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result-serialization.d.ts","sourceRoot":"","sources":["../src/result-serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"result-serialization.d.ts","sourceRoot":"","sources":["../src/result-serialization.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAoD,MAAM,aAAa,CAAC;AAEvF,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
|
@@ -6,7 +6,8 @@ export interface Result<TSuccess, TError> {
|
|
|
6
6
|
catchErrorAsync<TResult extends Result<any, any>>(f: (error: TError) => Promise<TResult>): Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;
|
|
7
7
|
unwrapOrThrow(errorCallback?: (e: TError) => void): TSuccess;
|
|
8
8
|
}
|
|
9
|
-
export interface
|
|
9
|
+
export interface ResultImplementation<TSuccess, TError> extends Result<TSuccess, TError> {
|
|
10
|
+
_type: "ts-result";
|
|
10
11
|
getValueUnsafe(): TSuccess;
|
|
11
12
|
getErrorUnsafe(): TError;
|
|
12
13
|
}
|
package/dist/result.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM,CAAC,QAAQ,EAAE,MAAM;IACtC,SAAS,IAAI,OAAO,CAAC;IACrB,OAAO,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACtC,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,GAC9B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3C,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,UAAU,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACzC,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAC5B,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC9C,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC;CAC9D;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
|
package/dist/result.d.ts
CHANGED
|
@@ -6,7 +6,8 @@ export interface Result<TSuccess, TError> {
|
|
|
6
6
|
catchErrorAsync<TResult extends Result<any, any>>(f: (error: TError) => Promise<TResult>): Promise<Result<TSuccess | SuccessType<TResult>, ErrorType<TResult>>>;
|
|
7
7
|
unwrapOrThrow(errorCallback?: (e: TError) => void): TSuccess;
|
|
8
8
|
}
|
|
9
|
-
export interface
|
|
9
|
+
export interface ResultImplementation<TSuccess, TError> extends Result<TSuccess, TError> {
|
|
10
|
+
_type: "ts-result";
|
|
10
11
|
getValueUnsafe(): TSuccess;
|
|
11
12
|
getErrorUnsafe(): TError;
|
|
12
13
|
}
|
package/dist/result.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM,CAAC,QAAQ,EAAE,MAAM;IACtC,SAAS,IAAI,OAAO,CAAC;IACrB,OAAO,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACtC,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,GAC9B,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7D,YAAY,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC3C,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,KAAK,OAAO,CAAC,OAAO,CAAC,GACvC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACtE,UAAU,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EACzC,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,GAC5B,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IAC/D,eAAe,CAAC,OAAO,SAAS,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAC9C,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,GACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACxE,aAAa,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,QAAQ,CAAC;CAC9D;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"result.d.ts","sourceRoot":"","sources":["../src/result.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
export * from
|
|
2
|
-
export * from
|
|
1
|
+
export * from "./result.js";
|
|
2
|
+
export * from "./result-functions.js";
|
|
3
|
+
export * from "./result-serialization.js";
|
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
1
|
+
import { describe, expect, it, test } from "vitest";
|
|
2
2
|
import { resultSuccess } from "./result";
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
deserializeResult,
|
|
5
|
+
isResult,
|
|
6
|
+
serializeResult,
|
|
7
|
+
} from "./result-serialization";
|
|
4
8
|
|
|
5
9
|
describe("result-serialization", () => {
|
|
6
10
|
it("can be serialized and deserialized", () => {
|
|
@@ -15,4 +19,9 @@ describe("result-serialization", () => {
|
|
|
15
19
|
const deserializedResult = deserializeResult(parsedResult);
|
|
16
20
|
expect(typeof deserializedResult.andThen).toBe("function");
|
|
17
21
|
});
|
|
22
|
+
|
|
23
|
+
test("isResult", () => {
|
|
24
|
+
const result = resultSuccess(42);
|
|
25
|
+
expect(isResult(result)).toBeTruthy();
|
|
26
|
+
});
|
|
18
27
|
});
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { Result, resultError, resultSuccess,
|
|
1
|
+
import { Result, resultError, resultSuccess, ResultImplementation } from "./result.js";
|
|
2
2
|
|
|
3
|
-
type SerializedResult = {
|
|
3
|
+
export type SerializedResult = {
|
|
4
4
|
type: "ts-result";
|
|
5
5
|
isSuccess: boolean;
|
|
6
6
|
data: any;
|
|
@@ -9,7 +9,7 @@ type SerializedResult = {
|
|
|
9
9
|
export function serializeResult<TSuccess, TError>(
|
|
10
10
|
value: Result<TSuccess, TError>,
|
|
11
11
|
): SerializedResult {
|
|
12
|
-
const unsafeResult = value as
|
|
12
|
+
const unsafeResult = value as ResultImplementation<TSuccess, TError>;
|
|
13
13
|
if (unsafeResult.isSuccess()) {
|
|
14
14
|
return {
|
|
15
15
|
type: "ts-result",
|
|
@@ -34,6 +34,15 @@ function isValueSerializedResult(value: unknown): value is SerializedResult {
|
|
|
34
34
|
);
|
|
35
35
|
}
|
|
36
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
|
+
|
|
37
46
|
export function deserializeResult(value: unknown) {
|
|
38
47
|
if (!isValueSerializedResult(value)) {
|
|
39
48
|
throw new Error(
|
package/src/result.ts
CHANGED
|
@@ -15,10 +15,11 @@ export interface Result<TSuccess, TError> {
|
|
|
15
15
|
unwrapOrThrow(errorCallback?: (e: TError) => void): TSuccess;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
export interface
|
|
18
|
+
export interface ResultImplementation<TSuccess, TError> extends Result<
|
|
19
19
|
TSuccess,
|
|
20
20
|
TError
|
|
21
21
|
> {
|
|
22
|
+
_type: "ts-result";
|
|
22
23
|
getValueUnsafe(): TSuccess;
|
|
23
24
|
getErrorUnsafe(): TError;
|
|
24
25
|
}
|
|
@@ -88,7 +89,12 @@ export class resultError {
|
|
|
88
89
|
}
|
|
89
90
|
}
|
|
90
91
|
|
|
91
|
-
class ResultSuccessImp<TSuccess1> implements
|
|
92
|
+
class ResultSuccessImp<TSuccess1> implements ResultImplementation<
|
|
93
|
+
TSuccess1,
|
|
94
|
+
never
|
|
95
|
+
> {
|
|
96
|
+
public readonly _type = "ts-result";
|
|
97
|
+
|
|
92
98
|
constructor(private value: TSuccess1) {}
|
|
93
99
|
|
|
94
100
|
public getValueUnsafe(): TSuccess1 {
|
|
@@ -131,7 +137,9 @@ class ResultSuccessImp<TSuccess1> implements UnsafeResult<TSuccess1, never> {
|
|
|
131
137
|
}
|
|
132
138
|
}
|
|
133
139
|
|
|
134
|
-
class ResultErrorImp<TError1> implements
|
|
140
|
+
class ResultErrorImp<TError1> implements ResultImplementation<never, TError1> {
|
|
141
|
+
public readonly _type = "ts-result";
|
|
142
|
+
|
|
135
143
|
constructor(private error: TError1) {}
|
|
136
144
|
|
|
137
145
|
public getValueUnsafe(): never {
|