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