unhoax-chance
Version:
Generate seeded Chance fixtures based on unhoax schemas
3 lines (2 loc) • 3.02 kB
JavaScript
;var e=require("chance"),n=require("unhoax");const t={maxArraySize:1e3,maxMapSize:1e3,maxRecordSize:200,maxSetSize:1e3,maxDateValue:864e13,minDateValue:-864e13},r=new WeakMap;function i(t,i){const a=r.get(t);if(a)return a;const o=r=>{const a=r instanceof e.Chance?r:r?new e.Chance(r):new e.Chance,o=function(e){return e.name in b?e.name:e.name.startsWith("Map<")?"Map":e.name.startsWith("Set<")?"Set":e.name.startsWith("Array<")?"array":"props"in e?"object":e.meta?.union?"union":e.meta?.literal?"literal":e.name.startsWith("Record<")?"record":"items"in e?"tuple":void 0}(t),m=o?b[o]:i?.[t.name];if(!m)throw new Error(`no mapping found for schema "${t.name}" (inferred as "${o}")`);if(!i)return m(a,t);const{props:s}=t,u=Object.keys(i),c=Object.fromEntries(Object.entries(s).filter((([e])=>!u.includes(e))));return{...m(a,n.x.object(c)),...Object.fromEntries(Object.entries(i).map((([e,n])=>[e,n(a,s[e])])))}};return r.set(t,o),o}function a(e){return e.refinements?.size?.min??0}function o(e){return e.refinements?.size?.max}function m(e){const n=e.refinements?.min,t=n?.value;if(!t)return"bigint"===e.name?0:void 0;const r=Number(t.valueOf());return n?.exclusive?r+(e.name.toLowerCase().includes("number")?.01:1):r}function s(e){const n=e.refinements?.max,t=n?.value;if(!t)return;const r=Number(t.valueOf());return n?.exclusive?r-(e.name.toLowerCase().includes("number")?.01:1):r}const u=Boolean,c=(e,n)=>{const t=n.meta.literal.literals;if(0===t.length)throw new Error("no literal to generate (empty list)");return e.pickone(t)},l=(e,n)=>e.floating({min:m(n),max:s(n)}),f=(e,n)=>e.integer({min:m(n),max:s(n)}),x=(e,n)=>{const t=a(n),r=o(n),i=t||r?e.integer({min:t,max:r}):void 0;return e.string({length:i})},p={boolean:e=>e.bool(),bigint:(e,n)=>{const t=e.integer({min:m(n),max:s(n)});return BigInt(t)},date:(e,n)=>{const r=Math.max(...[t.minDateValue,m(n)].filter(u)),i=Math.min(...[t.maxDateValue,s(n)].filter(u)),a=e.integer({min:r,max:Math.max(r,i)});return new Date(a)},integer:f,number:l,string:x,unsafeInteger:f,unsafeNumber:l,untrimmedString:x,literal:c,array:(g=()=>i,(e,n)=>{const t=g()(n.item),r=e.integer({min:a(n),max:o(n)});return e.n((()=>t(e)),r)}),object:(e=>(n,t)=>{const r=e(),{props:i}=t,a={};for(const e in i)a[e]=r(i[e])(n);return a})((()=>i)),Enum:c,union:(e=>(n,t)=>{const r=e(),i=t.meta.union.schemas;return r(n.pickone(i))(n)})((()=>i)),Map:(e=>(n,t)=>{const r=e(),[i,m]=t.item.items,s=n.integer({min:a(t),max:o(t)}),u=r(i),c=r(m);return new Map(n.n((()=>[u(n),c(n)]),s))})((()=>i)),record:(e=>(n,r)=>{const i=e(),{key:a,value:o}=r,m=n.integer({min:0,max:t.maxRecordSize}),s=i(a),u=i(o);return Object.fromEntries(n.n((()=>[s(n),u(n)]),m))})((()=>i)),Set:(e=>(n,t)=>{const r=e()(t.item),i=n.integer({min:a(t),max:o(t)});return new Set(n.n((()=>r(n)),i))})((()=>i)),tuple:(e=>(n,t)=>{const r=e(),{items:i}=t;return Object.values(i).map((e=>r(e)(n)))})((()=>i))};var g;const b={...p};exports.createFixtureFactory=i,exports.defaults=t,exports.factories=b;
//# sourceMappingURL=main.js.map