UNPKG

ts-safe

Version:

A functional, type-safe utility library for elegant error handling and asynchronous operations in JavaScript/TypeScript.

2 lines (1 loc) 2.17 kB
var m=e=>typeof e=="function",n=e=>m(e?.then);var w=e=>{try{return e instanceof Error?e:typeof e=="string"?new Error(e):new Error(JSON.stringify(e))}catch(a){return a}},f=e=>({isOk:!0,error:void 0,value:e}),u=e=>({isOk:!1,error:w(e),value:void 0}),A=(e,a)=>{if(n(e))return e.then(a).then(f,u);try{let r=a(e);return n(r)?r.then(t=>Promise.resolve(f(t)),t=>Promise.resolve(u(t))):f(r)}catch(r){return u(r)}},s={ok:f,fail:u,update:A};var T=e=>{let a=r=>T(s.update(e,r));return{map(r){return a(t=>{if(t.isOk)return r(t.value);throw t.error})},flatMap(r){return a(t=>{if(t.isOk)return r(t.value).unwrap();throw t.error})},effect(r){return a(t=>{if(!t.isOk)throw t.error;let i=r(t.value);return n(i)?i.then(()=>t.value):t.value})},watch(r){return a(t=>{try{r({...t})}catch{}if(t.isOk)return t.value;throw t.error})},catch(r){return a(t=>t.isOk?t.value:r(t.error))},unwrap(){if(n(e))return e.then(r=>{if(r.isOk)return r.value;throw r.error});if(e.isOk)return e.value;throw e.error},isOk:n(e)?e.then(r=>Promise.resolve(r.isOk)):e.isOk,orElse(r){return a(t=>t.isOk?t.value:r).unwrap()}}};function p(e){let a=T(s.ok(void 0));try{return a.map(()=>e)}catch(r){return a.map(()=>{throw r})}}function S(e){let a=T(s.ok(void 0));try{return a.map(()=>e())}catch(r){return a.map(()=>{throw r})}}function c(){return T(s.ok(void 0))}function P(...e){return a=>{let r=p(a);return e.reduce((t,i)=>t.map(i),r)}}var D=(e="Value is null or undefined")=>a=>{if(a==null)throw new Error(e);return a},F=(e="Value is falsy")=>a=>{if(!a)throw new Error(e);return a},g=(e="Value is empty")=>a=>{if(a.length===0)throw new Error(e);return a},V=e=>a=>{let r=e(a);if(r)throw new Error(r);return a};var W=e=>a=>{a.isOk||e(a.error)},G=e=>a=>{a.isOk&&e(a.value)};var z=(e,a)=>{let r=a?.maxTries??3,t=a?.delay??1e3,i=a?.backoff??!1;return async k=>{let d;for(let o=0;o<r;o++)try{return await e(k)}catch(l){if(d=l,o<r-1){let x=i?t*Math.pow(2,o):t;await new Promise(U=>setTimeout(U,x))}}throw d}};function y(e){return e===void 0?c():m(e)?S(e):p(e)}y.pipe=P;var Q=y;export{V as errorIf,g as errorIfEmpty,F as errorIfFalsy,D as errorIfNull,z as retry,Q as s,y as safe,P as safePipe,W as watchError,G as watchOk};