UNPKG

grule

Version:

A simple and powerful mechanism for validating rules in JSON.

2 lines (1 loc) 4.12 kB
var E=Object.create,n=Object.defineProperty,q=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty,w=Object.getOwnPropertyNames,R=Object.getOwnPropertyDescriptor;var f=t=>n(t,"__esModule",{value:!0});var S=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports),D=(t,e)=>{for(var r in e)n(t,r,{get:e[r],enumerable:!0})},P=(t,e,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of w(e))!k.call(t,a)&&a!=="default"&&n(t,a,{get:()=>e[a],enumerable:!(r=R(e,a))||r.enumerable});return t},L=t=>P(f(n(t!=null?E(q(t)):{},"default",t&&t.__esModule&&"default"in t?{get:()=>t.default,enumerable:!0}:{value:t,enumerable:!0})),t);var b=S(I=>{var m=Object.defineProperty,$=t=>m(t,"__esModule",{value:!0}),j=(t,e)=>{for(var r in e)m(t,r,{get:e[r],enumerable:!0})};$(I);j(I,{check:()=>p,checkAll:()=>C});var p=t=>{let e="null";try{e=typeof t=="undefined"?"undefined":t.constructor.name.toLowerCase()}catch{}return e},G=t=>({schema:{},payload:{},type:p(t),data:t}),C=t=>{let{payload:e,schema:r,type:a,data:o}=G(t);return a==="array"?(o.forEach(s=>{r[s]=p(s)}),e=r):a==="object"?(Object.keys(t).forEach(s=>{r[s]=p(o[s])}),e=r):e[o]=a,e}});f(exports);D(exports,{Grule:()=>x,GruleError:()=>i,Validator:()=>c});var d=class{constructor(){this.when=this.when.bind(this)}when(e){return Promise.resolve(e)}};var i=class extends Error{constructor(e,r){super(e);this.name="GruleError",Object.assign(this,{...r})}};var h=["less","lessOrEqual","greater","greaterOrEqual","equal","diff","in","notIn"],l={"less:lessOrEqual:greater:greaterOrEqual":["number","bigint"],"equal:diff":["bigint","boolean","number","string","date"],"in:notIn":["bigint","boolean","number","string","array"]};var g=L(b());var v=(t,e)=>{let r=(0,g.checkAll)(e),a=Object.values(r).every(s=>t&&t.includes(s)),o=r.arg0===r.arg1;return{checked:a,equals:o,types:r}},O=t=>{let[e]=Object.keys(l).filter(r=>r.includes(t));return{key:e,types:l[e]}};var c=class{parseTypes(e){return`(${e.toString().replace(/,/g," | ")})`}operator(e){if(!h.includes(e))throw new i(`Allowed operators "${h}".`);return!0}validate(e,r){this.operator(e);let a=["array","object"],o=O(e),{checked:s,equals:T,types:u}=v(o.types,r);switch(o.key){case"less:lessOrEqual:greater:greaterOrEqual":if(!s)throw new i(`Operator "${e}" expects data type: ${this.parseTypes(o.types)}.`);return!0;case"equal:diff":if(Object.values(u).some(A=>a.includes(A)))throw new i(`Operator "${e}" expects data type: ${this.parseTypes(o.types)}.`);return!0;case"in:notIn":if(s){if(T&&u.arg0!=="string"&&u.arg1!=="string")throw new i(`Operator "${e}" accepts: arg0 type ${this.parseTypes(["array","string"])} and arg1 type ${this.parseTypes(l["equal:diff"])}".`)}else throw new i(`Operator "${e}" expects data type "${o.types}".`);return!0;default:return!1}}};var y=class{constructor(e){this.validator=new c,this.arg0=e}get $value(){return this.arg0}args(e){return{arg0:this.arg0,arg1:e}}eval(e,r){return this[e](r)}less(e){return this.validator.validate("less",this.args(e)),this.arg0<e}lessOrEqual(e){return this.validator.validate("lessOrEqual",this.args(e)),this.arg0<=e}greater(e){return this.validator.validate("greater",this.args(e)),this.arg0>e}greaterOrEqual(e){return this.validator.validate("greaterOrEqual",this.args(e)),this.arg0>=e}equal(e){return this.validator.validate("equal",this.args(e)),this.arg0===e}diff(e){return this.validator.validate("diff",this.args(e)),this.arg0!==e}in(e){return this.validator.validate("in",this.args(e)),e.includes(this.arg0)}notIn(e){return this.validator.validate("notIn",this.args(e)),!e.includes(this.arg0)}};var x=class{constructor(e){this.context={};this.facts=e}async subscribe(e){let r=Object.keys(this.facts);if(!r.length)throw new i("No attributes defined in facts.");r.forEach(s=>{this.context[s]=new y(this.facts[s])});let a=e(this.context,new d);return Object.keys(a).forEach(s=>{if(!r.includes(s))throw new i(`There is no value defined in the facts for the rule "${s}".`)}),Promise.all(Object.values(a))}async run(e){let r=await this.subscribe(e);return Object.values(r).every(a=>[void 0,!0].includes(a))}};0&&(module.exports={Grule,GruleError,Validator});