lib-result
Version:
A Rust-inspired `Result` type for type-safe error handling in TypeScript and JavaScript
226 lines (221 loc) • 5.03 kB
JavaScript
;
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
});