UNPKG

narrow-minded

Version:

Easy typeof validations with sophisticated TypeScript inference.

3 lines (2 loc) 3.06 kB
const e=Symbol("SOME"),r=(...r)=>Object.assign(r,{[e]:!0}),t=r=>Array.isArray(r)&&!(e in r),n=r=>Array.isArray(r)&&e in r,u=e=>l(e),l=e=>"object"==typeof e&&null!==e&&!Array.isArray(e),i=(e,r)=>o(e,r),o=(r,t)=>{if("string"==typeof r)return r===typeof t;if(Array.isArray(r))return e in r?r.some(e=>o(e,t)):!!Array.isArray(t)&&(0===r.length||t.every(e=>r.some(r=>o(r,e))));if("object"!=typeof t||null===t)return!1;const n=t;return Object.entries(r).every(([e,r])=>o(r,n[e]))},p=e=>r=>i(e,r);class s{static narrow(e){return new s(r=>i(e,r))}constructor(e){this.NF=void 0,this.NF=e}satisfied(e){return this.NF(e)}build(e){return e}and(e){const r=this.NF,t=e instanceof s?e.NF:e instanceof Function?e:r=>i(e,r);return new s(e=>r(e)&&t(e))}}const c=new s(e=>!0),a=e=>{const{value:r,level:t}=e;return"object"!=typeof r||null===r?[]:Object.entries(r).map(([r,n])=>({property:r,value:n,level:t+1,parent:e}))},v=e=>void 0===e||Boolean(e),d={depth:{dequeue:e=>e.pop(),enqueue:(e,r,t)=>{if(!v(t))return;const n=a(e);n.reverse(),r.push(...n)}},breadth:{dequeue:e=>e.shift(),enqueue:(e,r,t)=>{if(!v(t))return;const n=a(e);r.push(...n)}}},y=(e,{visit:r,dequeue:t,enqueue:n})=>{const u=[{property:"",value:e,level:0,parent:void 0}];for(;u.length>0;){const e=t(u);n(e,u,r(e))}},f=(e,r)=>y(e,{visit:r,dequeue:d.depth.dequeue,enqueue:d.depth.enqueue}),h=(e,r)=>y(e,{visit:r,dequeue:d.breadth.dequeue,enqueue:d.breadth.enqueue}),q=(e,r)=>{const t=[];return y({expected:e,received:r},{visit:e=>{const{value:r}=e,{expected:n,received:u}=r;return!!g(n,u)||(b(e)||t.push({level:e.level,property:e.property,expected:n,received:u}),!1)},dequeue:e=>e.pop(),enqueue:(e,r,t)=>{if(t){const t=A(e);return t.reverse(),void r.push(...t)}const n=x(e);n&&r.push(n)}}),t},A=e=>{const{expected:i,received:o}=e.value;return u(i)&&l(o)?Object.entries(i).map(([r,t])=>({parent:e,level:e.level+1,property:r,value:{expected:t,received:o[r]}})):t(i)&&Array.isArray(o)?o.map((t,n)=>{const u=r(...i);return{parent:e,level:e.level+1,property:n.toString(),value:{expected:u,received:t}}}):n(i)?[{parent:e,level:e.level,property:e.property,value:{expected:i[0],received:o}}]:[]},b=e=>{const r=(e=>{const r=[e];for(;;){const e=r[0],t=null==e?void 0:e.parent;if(!t)break;r.unshift(t)}return r.reverse(),r})(e);return r.find(e=>{const{value:{expected:r}}=e;return n(r)&&r.length>1})},x=e=>{var t,u;const l=b(e),i=null!=l&&null!=(t=l.value)&&t.expected&&n(null==l||null==(u=l.value)?void 0:u.expected)?l.value.expected:void 0;if(l&&i)return{parent:l.parent,level:l.level,property:l.property,value:{expected:r(...i.slice(1)),received:l.value.received}}},g=(e,r)=>"string"==typeof e?e===typeof r:u(e)?l(r):t(e)?Array.isArray(r):!!n(e)&&0!==e.length&&g(e[0],r);export{d as DEFAULT_TRAVERSALS,s as Guard,e as SOME,q as diffNarrow,t as isNarrowerArr,u as isNarrowerObj,n as isNarrowerSome,l as isRecordObj,a as makeSubnodes,i as narrow,p as satisfier,v as shouldContinue,r as some,y as traverse,h as traverseObjectBreadthFirst,f as traverseObjectDepthFirst,c as unknown}; //# sourceMappingURL=index.modern.mjs.map