UNPKG

lib-result

Version:

A Rust-inspired `Result` type for type-safe error handling in TypeScript and JavaScript

226 lines (221 loc) 5.03 kB
"use strict"; var __defProp = Object.defineProperty; var __getOwnPropDesc = Object.getOwnPropertyDescriptor; var __getOwnPropNames = Object.getOwnPropertyNames; var __hasOwnProp = Object.prototype.hasOwnProperty; var __export = (target, all) => { for (var name in all) __defProp(target, name, { get: all[name], enumerable: true }); }; var __copyProps = (to, from, except, desc) => { if (from && typeof from === "object" || typeof from === "function") { for (let key of __getOwnPropNames(from)) if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); } return to; }; var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); // src/index.ts var index_exports = {}; __export(index_exports, { Err: () => Err, ErrFromObject: () => ErrFromObject, ErrFromText: () => ErrFromText, Ok: () => Ok, wrap: () => wrap, wrapAsync: () => wrapAsync, wrapAsyncThrowable: () => wrapAsyncThrowable, wrapThrowable: () => wrapThrowable }); module.exports = __toCommonJS(index_exports); // src/utils.ts function toError(e) { if (e instanceof Error) return e; if (typeof e === "string") return new Error(e); if (isKeyValue(e)) return createCustomError(e); return new Error("Unknown error"); } function isKeyValue(value) { return typeof value === "object" && value !== null && !Array.isArray(value); } function createCustomError(props) { const error = new Error(props?.message || "Unknown Error"); if (isKeyValue(props)) { return Object.assign(error, props); } return error; } // src/mixens.ts var methodsArray = [ withIsOk, withIsError, withUnwrap, withExpect, withMap, withPipe, withMatch, withOrElse, withUnwrapOr ]; function compose(base, ...fns) { return Object.freeze(fns.reduce((obj, fn) => fn(obj), base)); } function withIsOk(base) { return Object.assign(base, { isOk() { return this.error === void 0; } }); } function withIsError(base) { return Object.assign(base, { isError() { return this.error !== void 0; } }); } function withUnwrap(base) { return Object.assign(base, { unwrap() { if (this.isOk()) return this.ok; throw this.error; } }); } function withExpect(base) { return Object.assign(base, { expect(message) { if (this.isOk()) return this.ok; throw createCustomError({ message, cause: this.error }); } }); } function withMap(base) { return Object.assign(base, { map(fn) { try { if (this.isOk()) return Ok(fn(this.ok)); } catch (e) { return Err(toError(e)); } return Err(this.error); } }); } function withPipe(base) { return Object.assign(base, { pipe(fn) { try { if (this.isOk()) return fn(this.ok); } catch (e) { return Err(toError(e)); } return Err(this.error); } }); } function withMatch(base) { return Object.assign(base, { match(okFn, errFn) { try { if (this.isOk()) return okFn(this.ok); return errFn(this.error); } catch (e) { return errFn(toError(e)); } } }); } function withOrElse(base) { return Object.assign(base, { orElse(errFn) { try { if (this.isOk()) return this.ok; return errFn(this.error); } catch (e) { throw toError(e); } } }); } function withUnwrapOr(base) { return Object.assign(base, { unwrapOr(fallback) { return this.isOk() ? this.ok : fallback; } }); } function Ok(ok) { return compose({ ok, error: void 0 }, ...methodsArray); } function Err(error) { if (!(error instanceof Error)) { throw new TypeError( "Err expects an Error instance, use ErrFromObject instead." ); } return compose({ ok: void 0, error }, ...methodsArray); } function ErrFromText(message) { return compose( { ok: void 0, error: new Error(message) }, ...methodsArray ); } function ErrFromObject(props) { return compose( { ok: void 0, error: createCustomError(props) }, ...methodsArray ); } // src/main.ts function wrap(callback) { try { return Ok(callback()); } catch (error) { return Err(toError(error)); } } async function wrapAsync(callback) { try { return Ok(await callback()); } catch (error) { return Err(toError(error)); } } function wrapThrowable(callback) { return (...args) => { try { return Ok(callback(...args)); } catch (e) { return Err(toError(e)); } }; } function wrapAsyncThrowable(callback) { return async (...args) => { try { return Ok(await callback(...args)); } catch (e) { return Err(toError(e)); } }; } // Annotate the CommonJS export names for ESM import in node: 0 && (module.exports = { Err, ErrFromObject, ErrFromText, Ok, wrap, wrapAsync, wrapAsyncThrowable, wrapThrowable });