archetypes-rules
Version:
Move conditional logic out of source code and database triggers and into a reusable package, where explicit rules can be independently defined and managed.
1 lines • 22.1 kB
JavaScript
"use strict";var is=require("@sindresorhus/is"),ow=require("ow"),lodash=require("lodash.camelcase"),lodash$1=require("lodash.upperfirst"),lodash$2=require("lodash.get"),lodash$3=require("lodash.hasin"),lodash$4=require("lodash.set"),enumNomNommer=require("enum-nom-nommer"),lodash$5=require("lodash.isequal"),lodash$6=require("lodash.intersection"),lodash$7=require("lodash.includes"),lodash$8=require("lodash.invoke"),lodash$9=require("lodash.toarray"),lodash$a=require("lodash.kebabcase"),fsExtra=require("fs-extra");const assignTypeTo=(e,r="archetypes.rules")=>{Object.defineProperty(e,"type",{configurable:!1,enumerable:!0,readable:!0,value:`${r}.${e.constructor.name}`,writable:!1})};var assignTypeTo_1=assignTypeTo;const predicates=[ow.array,ow.arrayBuffer,ow.boolean,ow.buffer,ow.dataView,ow.date,ow.error,ow.float32Array,ow.float64Array,ow.function,ow.int16Array,ow.int32Array,ow.int8Array,ow.iterable,ow.map,ow.nan,ow.null,ow.nullOrUndefined,ow.number,ow.object,ow.promise,ow.regExp,ow.set,ow.string,ow.symbol,ow.typedArray,ow.uint16Array,ow.uint32Array,ow.uint8Array,ow.uint8ClampedArray,ow.undefined,ow.weakMap,ow.weakSet],anyTypePredicate=ow.any(...predicates);var anyTypePredicate_1=anyTypePredicate;class RuleElement{constructor(e,r,a=anyTypePredicate_1){ow(r,a),this.name=e,this.value=r,assignTypeTo_1(this)}toString(){return`${this.constructor.name} name = ${this.name}, value = ${this.value}`}}var ruleElement=RuleElement;const createMethodNameFrom=e=>`is${lodash$1(lodash(e))}`;var createMethodNameFrom_1=createMethodNameFrom;const getTypePredicate=(e,r)=>is.string(lodash$2(r,e));var getTypePredicate_1=getTypePredicate;const ARRAY_VARIABLE="archetypes.rules.ArrayVariable",DATE_VARIABLE="archetypes.rules.DateVariable",ERROR_VARIABLE="archetypes.rules.ErrorVariable",FACT="archetypes.rules.RuleContext",MAP_VARIABLE="archetypes.rules.MapVariable",NUMBER_VARIABLE="archetypes.rules.NumberVariable",OBJECT_VARIABLE="archetypes.rules.ObjectVariable",OPERATOR="archetypes.rules.Operator",PROPOSITION="archetypes.rules.Proposition",RULE_CONTEXT="archetypes.rules.RuleContext",RULE_ELEMENT="archetypes.rules.RuleElement",RULE_OVERRIDE="archetypes.rules.RuleOverride",RULE_SET="archetypes.rules.RuleSet",RULE="archetypes.rules.Rule",SET_VARIABLE="archetypes.rules.SetVariable",STRING_VARIABLE="archetypes.rules.StringVariable",SYMBOL_VARIABLE="archetypes.rules.SymbolVariable",VARIABLE="archetypes.rules.Variable",WEAK_MAP_VARIABLE="archetypes.rules.WeakMapVariable",WEAK_SET_VARIABLE="archetypes.rules.WeakSetVariable";var types={ARRAY_VARIABLE:ARRAY_VARIABLE,DATE_VARIABLE:DATE_VARIABLE,ERROR_VARIABLE:ERROR_VARIABLE,FACT:FACT,MAP_VARIABLE:MAP_VARIABLE,NUMBER_VARIABLE:NUMBER_VARIABLE,OBJECT_VARIABLE:OBJECT_VARIABLE,OPERATOR:OPERATOR,PROPOSITION:PROPOSITION,RULE_CONTEXT:RULE_CONTEXT,RULE_ELEMENT:RULE_ELEMENT,RULE_OVERRIDE:RULE_OVERRIDE,RULE_SET:RULE_SET,RULE:RULE,SET_VARIABLE:SET_VARIABLE,STRING_VARIABLE:STRING_VARIABLE,SYMBOL_VARIABLE:SYMBOL_VARIABLE,VARIABLE:VARIABLE,WEAK_MAP_VARIABLE:WEAK_MAP_VARIABLE,WEAK_SET_VARIABLE:WEAK_SET_VARIABLE},types$1=Object.freeze({__proto__:null,ARRAY_VARIABLE:ARRAY_VARIABLE,DATE_VARIABLE:DATE_VARIABLE,ERROR_VARIABLE:ERROR_VARIABLE,FACT:FACT,MAP_VARIABLE:MAP_VARIABLE,NUMBER_VARIABLE:NUMBER_VARIABLE,OBJECT_VARIABLE:OBJECT_VARIABLE,OPERATOR:OPERATOR,PROPOSITION:PROPOSITION,RULE_CONTEXT:RULE_CONTEXT,RULE_ELEMENT:RULE_ELEMENT,RULE_OVERRIDE:RULE_OVERRIDE,RULE_SET:RULE_SET,RULE:RULE,SET_VARIABLE:SET_VARIABLE,STRING_VARIABLE:STRING_VARIABLE,SYMBOL_VARIABLE:SYMBOL_VARIABLE,VARIABLE:VARIABLE,WEAK_MAP_VARIABLE:WEAK_MAP_VARIABLE,WEAK_SET_VARIABLE:WEAK_SET_VARIABLE,default:types});function getCjsExportFromNamespace(e){return e&&e.default||e}var types$2=getCjsExportFromNamespace(types$1);const isType=(e,r)=>lodash$3(e,"type")&&e.type===lodash$2(types$2,r);var isType_1=isType;const assignTypeInspectionMethods=e=>{Object.keys(e).filter(r=>getTypePredicate_1(r,e)).forEach(r=>{const a=createMethodNameFrom_1(r);lodash$4(e,a,e=>isType_1(e,r))})};var assignTypeInspectionMethods_1=assignTypeInspectionMethods;const typeMap=new Map(Object.entries(is));var typeMap_1=typeMap;const isTypeOf=(e,r)=>lodash$3(e,"type")?e.type===r:typeMap_1.get(r)(e);var isTypeOf_1=isTypeOf;const isValueTypeOf=(e,r)=>lodash$3(e,"value")?typeMap_1.get(r)(e.value):typeMap_1.get(r)(e);var isValueTypeOf_1=isValueTypeOf;const typeOf=e=>lodash$3(e,"type")?e.type:is(e);var typeOf_1=typeOf;const valueTypeOf=e=>lodash$3(e,"value")?is(e.value):is(e);var valueTypeOf_1=valueTypeOf;const{enumFactory:enumFactory}=enumNomNommer,typeInspector=Object.assign(enumFactory.create(types$2),{isTypeOf:isTypeOf_1,isValueTypeOf:isValueTypeOf_1,typeOf:typeOf_1,valueTypeOf:valueTypeOf_1});assignTypeInspectionMethods_1(typeInspector);var typeInspector_1=typeInspector;const createRuleElementName=(e,r,a)=>is.nullOrUndefined(r)?e.name:`(${e.name} ${a} ${r.name})`;var createRuleElementName_1=createRuleElementName;const{PROPOSITION:PROPOSITION$1}=typeInspector_1;class Proposition extends ruleElement{constructor(e,r){super(e,r,ow.boolean)}and(e){const r=this.value&&e.value;return Proposition.factory(this,r,e,"AND")}not(){return new Proposition(`(NOT ${this.name})`,!this.value)}or(e){const r=this.value||e.value;return Proposition.factory(this,r,e,"OR")}xor(e){const r=!this.value!=!e.value;return Proposition.factory(this,r,e,"XOR")}static factory(e,r,a,t){if(is.string(e))return new Proposition(e,r);const o=createRuleElementName_1(e,a,t);return new Proposition(o,r)}static isProposition(e){return lodash$2(e,"type")===PROPOSITION$1}}var proposition=Proposition;const isVariable=e=>{if(is.object(e)&&e.hasOwnProperty("type")){const r=0;return e.type.search(/archetypes\.rules\.\w+Variable/)===r}return!1};var isVariable_1=isVariable;class Variable extends ruleElement{equalTo(e){const r=lodash$5(this.value,e.value);return proposition.factory(this,r,e,"===")}eq(e){return this.equalTo(e)}greaterThan(e){const r=this.value>e.value;return proposition.factory(this,r,e,">")}gt(e){return this.greaterThan(e)}greaterThanOrEqualTo(e){const r=this.value>=e.value;return proposition.factory(this,r,e,">=")}gte(e){return this.greaterThanOrEqualTo(e)}lessThan(e){const r=this.value<e.value;return proposition.factory(this,r,e,"<")}lt(e){return this.lessThan(e)}lessThanOrEqualTo(e){const r=this.value<=e.value;return proposition.factory(this,r,e,"<=")}lte(e){return this.lessThanOrEqualTo(e)}notEqualTo(e){const r=this.value!==e.value;return proposition.factory(this,r,e,"!==")}neq(e){return this.notEqualTo(e)}static isVariable(e){return isVariable_1(e)}static createNullObject(e){return new Variable(e,null,ow.null)}}var variable=Variable;const{isProposition:isProposition}=proposition,{isVariable:isVariable$1}=variable,isPropositionOrVariable=e=>!is.nullOrUndefined(e)&&(isProposition(e)||isVariable$1(e));var isPropositionOrVariable_1=isPropositionOrVariable,validOperators=["AFTER","AND","BEFORE","CONFORMS_TO","ENDS_WITH","EQ","EQUAL_TO","EVERY","EXCEEDS_MAX_LENGTH","GREATER_THAN_OR_EQUAL_TO","GREATER_THAN","GT","GTE","HAS_IN","HAS","INCLUDES","INCLUDES_ANY","IS_EMPTY","IS_NOT_EMPTY","IS_ONE_OF","LACKS_MIN_LENGTH","LESS_THAN_OR_EQUAL_TO","LESS_THAN","LT","LTE","MATCH","MATCHES","NEQ","NOT_EQUAL_TO","NOT","OR","SOME","STARTS_WITH","XOR"],validOperators$1=Object.freeze({__proto__:null,default:validOperators}),validOperators$2=getCjsExportFromNamespace(validOperators$1);const defaultOptions={throws:!0};class Operator{constructor(e,r=defaultOptions){Operator.isValid(e,r),this.name=e,assignTypeTo_1(this)}toOperationName(){return lodash(this.toString())}toString(){return this.name}static factory(e,r=defaultOptions){return is.string(e)?new Operator(e,r):e}static isOperator(e){return e.type===typeInspector_1.OPERATOR}static isValid(e,r={throws:!1}){return r.throws&&ow(e,ow.string.oneOf(validOperators$2)),validOperators$2.includes(e)}valueOf(){return this.toString()}}var operator=Operator;const definePropertyLength=e=>{Object.defineProperty(e,"length",{get:()=>Object.keys(e).length})};var definePropertyLength_1=definePropertyLength;const getName=e=>{let r=e;return is.object(e)&&(r=lodash$2(e,"name")),r};var getName_1=getName;const EMPTY=0;class ArrayVariable extends variable{constructor(e,r=[]){super(e,r,ow.array)}isEmpty(){return new proposition("IS_EMPTY",0===this.value.length)}isNonEmpty(){return new proposition("IS_NON_EMPTY",0!==this.value.length)}equalTo(e){const r=lodash$5(this.value,e.value);return proposition.factory(this,r,e,"===")}greaterThan(e){const r=this.value.length>e.value.length;return proposition.factory(this,r,e,">")}greaterThanOrEqualTo(e){const r=this.value.length>=e.value.length;return proposition.factory(this,r,e,">=")}includes(e){const r=lodash$7(this.value,...e.value);return proposition.factory(this,r,e,"INCLUDES")}includesAny(e){const r=is.nonEmptyArray(lodash$6(this.value,e.value));return proposition.factory(this,r,e,"INCLUDES_ANY")}lessThan(e){const r=this.value.length<e.value.length;return proposition.factory(this,r,e,"<")}lessThanOrEqualTo(e){const r=this.value.length<=e.value.length;return proposition.factory(this,r,e,"<=")}notEqualTo(e){const r=proposition.factory(this,!0,e,"!==");try{ow(e.value,ow.array.not.deepEqual(this.value))}catch(e){r.value=!1}return r}static createNullObject(e){const r=new ArrayVariable(e);return r.value=null,r}}var arrayVariable=ArrayVariable;class DateVariable extends variable{constructor(e,r=new Date){super(e,r,ow.any(ow.date,ow.string))}after(e){return this.gt(e)}before(e){return this.lt(e)}static createNullObject(e){const r=new DateVariable(e);return r.value=null,r}}var dateVariable=DateVariable;class ErrorVariable extends variable{constructor(e,r){super(e,r,ow.error)}static createNullObject(e){const r=new ErrorVariable(e,new Error("NullErrorVariable"));return r.value=null,r}}var errorVariable=ErrorVariable;class MapVariable extends variable{constructor(e,r=new Map){super(e,r,ow.map)}static createNullObject(e){const r=new MapVariable(e);return r.value=null,r}}var mapVariable=MapVariable;class NumberVariable extends variable{constructor(e,r=0){super(e,r,ow.number)}static createNullObject(e){const r=new NumberVariable(e);return r.value=null,r}}var numberVariable=NumberVariable;class ObjectVariable extends variable{constructor(e,r={}){super(e,r,ow.object)}static createNullObject(e){const r=new ObjectVariable(e);return r.value=null,r}}var objectVariable=ObjectVariable;class SetVariable extends variable{constructor(e,r=new Set){super(e,r,ow.set)}static createNullObject(e){const r=new SetVariable(e);return r.value=null,r}}var setVariable=SetVariable;const validateType=(e,r)=>{ow(e,ow.object.instanceOf(r))};var validateType_1=validateType;const{emptyString:emptyString,nonEmptyString:nonEmptyString}=is;class StringVariable extends variable{constructor(e,r=""){super(e,r,ow.any(ow.string,ow.regExp))}endsWith(e){return validateType_1(e,StringVariable),new proposition(`(${this.name} ENDS_WITH "${e.value}")`,this.value.endsWith(e.value))}exceedsMaxLength(e){return validateType_1(e,numberVariable),new proposition(`${this.name} EXCEEDS_MAX_LENGTH ${e.value}`,this.value.length<=e.value)}isEmpty(){return new proposition(`(IS_EMPTY ${this.name})`,emptyString(this.value))}isNotEmpty(){return new proposition(`(IS_NOT_EMPTY ${this.name})`,nonEmptyString(this.value))}isOneOf(e){return validateType_1(e,arrayVariable),new proposition(`(${this.name} IS_ONE_OF "${e.value.join('", "')}")`,e.value.includes(this.value))}includes(e){return validateType_1(e,StringVariable),new proposition(`(${this.name} INCLUDES "${e.value}")`,this.value.includes(e.value))}lacksMinLength(e){return validateType_1(e,numberVariable),new numberVariable("number-of-characters",this.value.length).greaterThanOrEqualTo(e)}matches(e){validateType_1(e.value,RegExp);const r=Array.isArray(this.value.match(e.value));return new proposition(`(${this.name} MATCHES ${e.value})`,r)}startsWith(e){validateType_1(e,StringVariable);const r=this.value.startsWith(e.value);return new proposition(`(${this.name} STARTS_WITH "${e.value}")`,r)}static createNullObject(e){const r=new StringVariable(e);return r.value=null,r}}var stringVariable=StringVariable;class SymbolVariable extends variable{constructor(e,r){super(e,r,ow.symbol)}}var symbolVariable=SymbolVariable;class WeakMapVariable extends variable{constructor(e,r=new WeakMap){super(e,r,ow.weakMap)}static createNullObject(e){const r=new WeakMapVariable(e);return r.value=null,r}}var weakMapVariable=WeakMapVariable;class WeakSetVariable extends variable{constructor(e,r=new WeakSet){super(e,r,ow.weakSet)}static createNullObject(e){const r=new WeakSetVariable(e);return r.value=null,r}}var weakSetVariable=WeakSetVariable;const{date:date,error:error,map:map,number:number,object:object,set:set,string:string,symbol:symbol,weakMap:weakMap,weakSet:weakSet}=is,variableTypeMap=new Map([[Array.isArray,arrayVariable],[date,dateVariable],[error,errorVariable],[map,mapVariable],[number,numberVariable],[set,setVariable],[string,stringVariable],[symbol,symbolVariable],[weakMap,weakMapVariable],[weakSet,weakSetVariable],[object,objectVariable]]),createVariableByInference=(e,r)=>{let a=null;for(let[t,o]of variableTypeMap)if(t(r)){a=new o(e,r);break}return a};var createVariableByInference_1=createVariableByInference;const isTypeNullVariable=e=>{if(is.string(e)){const r=e.toLowerCase();return r.startsWith("null")&&r.endsWith("variable")}return!1};var isTypeNullVariable_1=isTypeNullVariable;const nullVariableType=new Map([["NULL_ARRAY_VARIABLE",e=>arrayVariable.createNullObject(e)],["NULL_DATE_VARIABLE",e=>dateVariable.createNullObject(e)],["NULL_ERROR_VARIABLE",e=>errorVariable.createNullObject(e)],["NULL_MAP_VARIABLE",e=>mapVariable.createNullObject(e)],["NULL_NUMBER_VARIABLE",e=>numberVariable.createNullObject(e)],["NULL_OBJECT_VARIABLE",e=>objectVariable.createNullObject(e)],["NULL_SET_VARIABLE",e=>setVariable.createNullObject(e)],["NULL_STRING_VARIABLE",e=>stringVariable.createNullObject(e)],["NULL_WEAK_MAP_VARIABLE",e=>weakMapVariable.createNullObject(e)],["NULL_WEAK_SET_VARIABLE",e=>weakSetVariable.createNullObject(e)]]);var nullVariableType_1=nullVariableType;const getNullVariableOrReference=(e,r)=>{let a=null;return isTypeNullVariable_1(r)?a=nullVariableType_1.get(r)(e):isVariable_1(e)&&(a=e),a};var getNullVariableOrReference_1=getNullVariableOrReference;const{nullOrUndefined:nullOrUndefined}=is,variableFactory=(e,r)=>{let a=getNullVariableOrReference_1(e,r);return nullOrUndefined(a)&&(a=createVariableByInference_1(e,r)),a};var variableFactory_1=variableFactory;class RuleContext{constructor(e){this.name=e,this.elements={},definePropertyLength_1(this.elements),this.overrides={},definePropertyLength_1(this.overrides),assignTypeTo_1(this)}addProposition(e,r){return lodash$4(this.elements,e,new proposition(e,r)),this}addRuleOverride(e){return lodash$4(this.overrides,e.ruleName,e),this}addVariable(e,r){const a=variableFactory_1(e,r);return lodash$4(this.elements,e,a),this}append(e){return Object.assign(this.elements,e.elements),this}findElement(e){const r=getName_1(e);return lodash$2(this.elements,r)}findRuleOverride(e){const r=getName_1(e);return lodash$2(this.overrides,r)}}var ruleContext=RuleContext;const overrideRule=(e,r,a)=>{const t=r.findRuleOverride(e);return t?new proposition(`OVERRIDE: ${t.toString()}`,t.override):a};var overrideRule_1=overrideRule;class InvalidRuleElementError extends TypeError{constructor(e){super(e),this.name="InvalidRuleElementError",assignTypeTo_1(this)}}var invalidRuleElementError=InvalidRuleElementError;const popPairFrom=e=>({lhs:e.pop(),rhs:e.pop()});var popPairFrom_1=popPairFrom;const invokePredicate=(e,r)=>{if("not"===r){const r=e.pop();e.push(r.not())}else{const{lhs:a,rhs:t}=popPairFrom_1(e),o=lodash$8(t,r,a);e.push(o)}};var invokePredicate_1=invokePredicate;const processOperator=(e,r)=>{invokePredicate_1(e,r.toOperationName())};var processOperator_1=processOperator;const processRuleElement=(e,r)=>e.push(r);var processRuleElement_1=processRuleElement;const{isOperator:isOperator}=operator,process=e=>{const r=[];for(let a of e)if(isOperator(a))processOperator_1(r,a);else{if(!isPropositionOrVariable_1(a))throw new invalidRuleElementError(`Unknown RuleElement type "${a.toString()}".`);processRuleElement_1(r,a)}return r.shift()};var process_1=process;class Rule{constructor(e){this.name=e,this.elements=[],assignTypeTo_1(this)}addOperator(e){return ow(e,ow.any(ow.object.instanceOf(operator),ow.string)),this.elements.push(operator.factory(e)),this}addProposition(e,r=!1){return ow(e,ow.any(ow.object.instanceOf(proposition),ow.string)),this.elements.push(proposition.factory(e,r)),this}addVariable(e,r=null){return ow(e,ow.any(ow.object.instanceOf(variable),ow.string)),this.elements.push(variableFactory_1(e,r)),this}evaluate(e){ow(e,ow.object.instanceOf(ruleContext)),this.elements.forEach(r=>{const a=e.findElement(r);isPropositionOrVariable_1(a)&&(is.null(a.value)&&(a.value=r.value),r.value=a.value)});const r=process_1(this.elements);return overrideRule_1(this.name,e,r)}}var rule=Rule;class ActivityRule extends rule{evaluate(e){const r=super.evaluate(e);return r.value&&this.execute(),r}execute(){return this}}var activityRule=ActivityRule;const Fact=ruleContext;var fact=Fact;const assignTypeTo$1=(e,r="archetypes.rules")=>{Object.defineProperty(e,"type",{configurable:!1,enumerable:!0,readable:!0,value:`${r}.${e.name}`,writable:!1})};var assignTypeTo_1$1=assignTypeTo$1;const{isOperator:isOperator$1}=operator,{isProposition:isProposition$1}=proposition,{isVariable:isVariable$2}=variable,loadRuleElements=(e,r)=>(lodash$9(e).forEach(e=>{if(isProposition$1(e))r.addProposition(e.name,e.value);else if(isVariable$2(e)){const a=variableFactory_1(e.name,e.value);r.addVariable(a)}else{if(!isOperator$1(e))throw new invalidRuleElementError(e);r.addOperator(e.name)}}),r.elements);var loadRuleElements_1=loadRuleElements;const loadRuleFromObject=e=>{ow(e,ow.object);const{name:r,elements:a}=e,t=new rule(r);return loadRuleElements_1(a,t),t};var loadRuleFromObject_1=loadRuleFromObject;const defaultRuleOverrideOptions={authorizedBy:[],raisedBy:null,when:new Date,why:null};var defaultRuleOverrideOptions_1=defaultRuleOverrideOptions;const UNKNOWN="no-entry/unknown",format={key:e=>lodash$a(e),value(e){let r=UNKNOWN;return Array.isArray(e)&&is.nonEmptyArray(e)?r=e.join(", "):is.date(e)&&(r=e.toISOString()),r}};var format_1=format;const reducer=(e,r)=>e+`, ${r}`,reducePropertiesToStrings=e=>Object.entries(e).map(([e,r])=>`${format_1.key(e)}: "${format_1.value(r)}"`).reduce((e,r)=>reducer(e,r));var reducePropertiesToString=reducePropertiesToStrings;class RuleOverride{constructor(e,r,a=defaultRuleOverrideOptions_1){this.ruleName=e,this.override=r,Object.assign(this,a)}toString(){return reducePropertiesToString(this)}}var ruleOverride=RuleOverride;const loadRuleOverrideFromObject=e=>{ow(e,ow.object);const{authorizedBy:r,raisedBy:a,when:t,why:o,ruleName:s,override:l}=e;return new ruleOverride(s,l,{authorizedBy:r,raisedBy:a,when:t,why:o})};var loadRuleOverrideFromObject_1=loadRuleOverrideFromObject;const loadRuleContextFromObject=e=>{ow(e,ow.object);const{name:r,elements:a,overrides:t}=e,o=new ruleContext(r);return o.elements=loadRuleElements_1(a,o),lodash$9(t).forEach(e=>{const r=loadRuleOverrideFromObject_1(e);o.addRuleOverride(r)}),o};var loadRuleContextFromObject_1=loadRuleContextFromObject;class RuleSet{constructor(e){this.name=e,this.rules={},definePropertyLength_1(this.rules),this.ruleOverrides={},definePropertyLength_1(this.ruleOverrides),assignTypeTo_1(this)}addRule(e){return lodash$4(this.rules,e.name,e),this}addRuleOverride(e){return lodash$4(this.ruleOverrides,e.ruleName,e),this}evaluate(e){const r=e;return Object.values(this.ruleOverrides).forEach(e=>r.addRuleOverride(e)),Object.values(this.rules).map(e=>e.evaluate(r)).reduce((e,r)=>r.or(e))}}var ruleSet=RuleSet;const loadRuleSetFromObject=e=>{ow(e,ow.object);const r=new ruleSet(e.name);return Object.values(e.rules).forEach(e=>{r.addRule(loadRuleFromObject_1(e))}),Object.values(e.ruleOverrides).forEach(e=>{r.addRuleOverride(loadRuleOverrideFromObject_1(e))}),r};var loadRuleSetFromObject_1=loadRuleSetFromObject;const{isRule:isRule,isRuleContext:isRuleContext,isRuleOverride:isRuleOverride,isRuleSet:isRuleSet}=typeInspector_1,typeEvaluationMap=new Map([[e=>isRule(e),e=>loadRuleFromObject_1(e)],[e=>isRuleContext(e),e=>loadRuleContextFromObject_1(e)],[e=>isRuleOverride(e),e=>loadRuleOverrideFromObject_1(e)],[e=>isRuleSet(e),e=>loadRuleSetFromObject_1(e)]]),loadByType=e=>{let r=null;for(let[a,t]of typeEvaluationMap)if(a(e)){r=t(e);break}return r};var loadByType_1=loadByType;const createFromObject=e=>loadByType_1(e);var createFromObject_1=createFromObject;const defaultFileOptions={reviver:null,throws:!0};var defaultFileOptions_1=defaultFileOptions;const{readJSON:readJSON}=fsExtra,createFromFile=async(e,r=defaultFileOptions_1)=>{try{const a=await readJSON(e,r);return createFromObject_1(a)}catch(e){return e}};var createFromFile_1=createFromFile;const factory={createFromFile:createFromFile_1,createFromObject:createFromObject_1,createOperator:e=>operator.factory(e),createProposition:(e,r=!1)=>proposition.factory(e,r),createVariable:(e,r)=>variableFactory_1(e,r)};assignTypeTo_1$1(factory);var factory_1=factory;const operatorType=new Map;validOperators$2.forEach(e=>{operatorType.set(e,new operator(e)),lodash$4(operatorType,e,e)});var operatorType_1=operatorType;const archetypesRules={ActivityRule:activityRule,ArrayVariable:arrayVariable,DateVariable:dateVariable,ErrorVariable:errorVariable,Fact:fact,factory:factory_1,InvalidRuleElementError:invalidRuleElementError,MapVariable:mapVariable,NumberVariable:numberVariable,ObjectVariable:objectVariable,operatorType:operatorType_1,Operator:operator,Proposition:proposition,Rule:rule,RuleContext:ruleContext,RuleElement:ruleElement,RuleOverride:ruleOverride,RuleSet:ruleSet,SetVariable:setVariable,StringVariable:stringVariable,SymbolVariable:symbolVariable,typeInspector:typeInspector_1,Variable:variable,WeakMapVariable:weakMapVariable,WeakSetVariable:weakSetVariable};var lib=archetypesRules;module.exports=lib;