UNPKG

pure-parse

Version:

Strongly typed validation library that decouples type aliases from validation logic

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