UNPKG

pure-parse

Version:

Strongly typed validation library that decouples type aliases from validation logic

15 lines (14 loc) 2.27 kB
import{failure as p,propagateFailure as O,success as $}from"./ParseResult.js";import{isObject as y}from"../guards/primitives.js";import{propertyAbsent as f,omitProperty as j}from"../internals/optionalSymbol.js";const l="Not an object",m=e=>O(p(`Expected property ${JSON.stringify(e)} to be present`),{tag:"object",key:e}),R=e=>{const o=Object.entries(e);return n=>{if(!y(n))return p(l);const r={};for(let a=0;a<o.length;a++){const[t,u]=o[a],c=n[t];if(c===void 0&&!n.hasOwnProperty(t)){const s=u(f);if(s.tag==="failure"||s.value===f)return m(t);s.value!==j&&(r[t]=s.value)}else{const s=u(c);if(s.tag==="failure")return O(s,{tag:"object",key:t});r[t]=s.value}}return $(r)}},d=e=>{const o=Object.entries(e),n=o.map(([u,c])=>c),a=[`if(typeof data !== 'object' || data === null) return {tag:'failure', error: { message: ${JSON.stringify(l)}, path: [] }}`,"const dataOutput = {}","let parseResult",...o.map(([u,c],s)=>{const i=JSON.stringify(u),b=`data[${i}]`,g=`parsers[${s}]`;return` if(${b} === undefined && !data.hasOwnProperty(${i})) { const parseResult = ${g}(propertyAbsent) if(parseResult.tag === 'failure' || parseResult.value === propertyAbsent){ return ${JSON.stringify(m(u))} } if(parseResult.value !== omitProperty){ dataOutput[${i}] = parseResult.value } } else { parseResult = ${g}(${b}) if(parseResult.tag === 'failure') return {tag: 'failure', error: { message: parseResult.error.message, path:[{tag:'object', key:${i}}, ...parseResult.error.path] }} dataOutput[${i}] = parseResult.value }`}),"return {tag:'success', value:dataOutput}"].join(";"),t=new Function("data","propertyAbsent","omitProperty","parsers",a);return u=>t(u,f,j,n)},k=e=>{const o=R(e),n=new Set(Object.keys(e));return r=>{if(!y(r))return p(l);const a=Object.keys(r);for(const t of a)if(!n.has(t))return p(`Object has an extra property ${JSON.stringify(t)}`);return o(r)}},N=e=>{const o=d(e),n=new Set(Object.keys(e));return r=>{if(!y(r))return p(l);const a=Object.keys(r);for(const t of a)if(!n.has(t))return p(`Object has an extra property ${JSON.stringify(t)}`);return o(r)}};export{R as object,d as objectCompiled,k as objectStrict,N as objectStrictCompiled};