UNPKG

@formql/core

Version:

FormQL - A framework for building dynamic forms

141 lines 18.4 kB
import { __read, __spread } from "tslib"; import { HelperService } from '../services/helper.service'; var RuleLogic = /** @class */ (function () { function RuleLogic() { this.evalFunctions = ['GET', 'SUM']; } /* Perform a condition evaluation */ RuleLogic.prototype.doEval = function (condition, conditionFunctions) { var conditionFunctionsDeclares = Object.keys(conditionFunctions).map(function (x) { return "let " + x + " = conditionFunctions." + x + "; "; }).join(''); if (condition.trim() === '') return; if (this.evalFunctions.indexOf(condition.trim()) !== -1) throw Error("Funcitons need a parameter (e.g. GET('contact.firstName') )"); var props = []; var params = []; params.push(condition); params.push(conditionFunctions); props.push('condition'); props.push('conditionFunctions'); var expression = "\n 'use strict'\n " + conditionFunctionsDeclares + "\n let window = undefined;\n let document = undefined;\n let alert = undefined;\n let a = undefined;\n return " + condition + ";\n "; props.push(expression); try { var evalFunc = new (Function.bind.apply(Function, __spread([void 0], props)))(); var response = evalFunc.apply(void 0, __spread(params)); return response; } catch (err) { debugger; // intentionally left to help troubleshooting issues console.log(err); throw err; } }; /* Reset all dependancies for any given condition in a component */ RuleLogic.prototype.resetDependancies = function (formState, condition, component) { 'use strict'; var self = this; var registerFunctions = { GET: function (schema) { formState.components = self.setDependents(formState.components, schema, component.componentId); }, SUM: function () { var schemas = []; for (var _i = 0; _i < arguments.length; _i++) { schemas[_i] = arguments[_i]; } schemas.forEach(function (schema) { return formState.components = self.setDependents(formState.components, schema, component.componentId); }); } }; return this.doEval(condition, registerFunctions); }; /* Evaluetes the value of any given condition */ RuleLogic.prototype.evaluate = function (data, condition) { 'use strict'; var self = this; var evalFunctions = { GET: function (schema) { var result = self.getSchemaValue(data, schema); if (result !== undefined && result !== null) return result; else return ''; }, SUM: function () { var schemas = []; for (var _i = 0; _i < arguments.length; _i++) { schemas[_i] = arguments[_i]; } var total = 0; schemas.forEach(function (schema) { var value = self.getSchemaValue(data, schema); if (value && !isNaN(value)) total += value; }); return total; } }; return this.doEval(condition, evalFunctions); }; RuleLogic.prototype.evaluateCondition = function (data, condition) { var response = { value: false, error: null }; if (condition && condition.trim() !== '' && condition !== 'false') { if (condition === 'true') { response.value = true; return response; } if (!data) return response; try { response.value = this.evaluate(data, condition); } catch (err) { response.error = err; } if (response.value !== true) response.value = false; } return response; }; RuleLogic.prototype.evaluateValue = function (data, expression) { var response = { value: null, error: null }; if (!data) return response; try { response.value = this.evaluate(data, expression); } catch (err) { response.error = err; return response; } if (Number.isNaN(response.value) || response.value === Infinity) response.value = null; else response.value = HelperService.deepCopy(response.value); return response; }; RuleLogic.prototype.getSchemaValue = function (data, schema) { var evalFunc = new Function('data', 'schema', "return data." + schema); return evalFunc(data, schema); }; RuleLogic.prototype.setDependents = function (components, schema, componentId) { Object.keys(components).forEach(function (key) { var component = components[key]; if (component.schema === schema) { if (!component.dependents) component.dependents = [componentId]; else if (component.dependents.indexOf(componentId) === -1) component.dependents.push(componentId); } }); return components; }; return RuleLogic; }()); export { RuleLogic }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS1sb2dpYy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bmb3JtcWwvY29yZS8iLCJzb3VyY2VzIjpbInZhbGlkYXRvcnMvcnVsZS1sb2dpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBR0EsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNEO0lBSUU7UUFGUSxrQkFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXZCLENBQUM7SUFFakI7O01BRUU7SUFDTSwwQkFBTSxHQUFkLFVBQWtCLFNBQWlCLEVBQUUsa0JBQTBCO1FBRTdELElBQU0sMEJBQTBCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLFNBQU8sQ0FBQyw4QkFBeUIsQ0FBQyxPQUFJLEVBQXRDLENBQXNDLENBQUMsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFN0gsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRTtZQUN6QixPQUFPO1FBRVQsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckQsTUFBTSxLQUFLLENBQUMsNkRBQTZELENBQUMsQ0FBQztRQUU3RSxJQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDakIsSUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO1FBR2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDdkIsTUFBTSxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBRWhDLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDeEIsS0FBSyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO1FBRWpDLElBQU0sVUFBVSxHQUFHLDZDQUVULDBCQUEwQiw2S0FLbkIs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QUFhLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUUxRCxPQUFPLFFBQVEsQ0FBQztJQUNsQixDQUFDO0lBR08sa0NBQWMsR0FBdEIsVUFBNkIsSUFBTyxFQUFFLE1BQWM7UUFDbEQsSUFBTSxRQUFRLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxpQkFBZSxNQUFRLENBQUMsQ0FBQztRQUN6RSxPQUFPLFFBQVEsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFNLENBQUM7SUFDckMsQ0FBQztJQUVPLGlDQUFhLEdBQXJCLFVBQXNCLFVBQTBCLEVBQUUsTUFBYyxFQUFFLFdBQW1CO1FBQ25GLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQUMsR0FBRztZQUNsQyxJQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtnQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVO29CQUN2QixTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ2xDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2RCxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMxQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztJQUNILGdCQUFDO0FBQUQsQ0FBQyxBQWhLRCxJQWdLQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS1jb21wb25lbnQubW9kZWwnO1xyXG5pbXBvcnQgeyBGb3JtU3RhdGUsIEZvcm1Db21wb25lbnRzIH0gZnJvbSAnLi4vbW9kZWxzL2Zvcm0td2luZG93Lm1vZGVsJztcclxuaW1wb3J0IHsgRXZhbFJlc3BvbnNlIH0gZnJvbSAnLi4vbW9kZWxzL3R5cGUubW9kZWwnO1xyXG5pbXBvcnQgeyBIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaGVscGVyLnNlcnZpY2UnO1xyXG5cclxuZXhwb3J0IGNsYXNzIFJ1bGVMb2dpYyB7XHJcblxyXG4gIHByaXZhdGUgZXZhbEZ1bmN0aW9ucyA9IFsnR0VUJywgJ1NVTSddO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHsgfVxyXG5cclxuICAvKlxyXG4gICAgUGVyZm9ybSBhIGNvbmRpdGlvbiBldmFsdWF0aW9uXHJcbiAgKi9cclxuICBwcml2YXRlIGRvRXZhbDxVPihjb25kaXRpb246IHN0cmluZywgY29uZGl0aW9uRnVuY3Rpb25zOiBvYmplY3QpOiBVIHtcclxuXHJcbiAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbnNEZWNsYXJlcyA9IE9iamVjdC5rZXlzKGNvbmRpdGlvbkZ1bmN0aW9ucykubWFwKHggPT4gYGxldCAke3h9ID0gY29uZGl0aW9uRnVuY3Rpb25zLiR7eH07IGApLmpvaW4oJycpO1xyXG5cclxuICAgIGlmIChjb25kaXRpb24udHJpbSgpID09PSAnJylcclxuICAgICAgcmV0dXJuO1xyXG5cclxuICAgIGlmICh0aGlzLmV2YWxGdW5jdGlvbnMuaW5kZXhPZihjb25kaXRpb24udHJpbSgpKSAhPT0gLTEpXHJcbiAgICAgIHRocm93IEVycm9yKGBGdW5jaXRvbnMgbmVlZCBhIHBhcmFtZXRlciAoZS5nLiBHRVQoJ2NvbnRhY3QuZmlyc3ROYW1lJykgKWApO1xyXG5cclxuICAgIGNvbnN0IHByb3BzID0gW107XHJcbiAgICBjb25zdCBwYXJhbXMgPSBbXTtcclxuXHJcblxyXG4gICAgcGFyYW1zLnB1c2goY29uZGl0aW9uKTtcclxuICAgIHBhcmFtcy5wdXNoKGNvbmRpdGlvbkZ1bmN0aW9ucyk7XHJcblxyXG4gICAgcHJvcHMucHVzaCgnY29uZGl0aW9uJyk7XHJcbiAgICBwcm9wcy5wdXNoKCdjb25kaXRpb25GdW5jdGlvbnMnKTtcclxuXHJcbiAgICBjb25zdCBleHByZXNzaW9uID0gYFxyXG4gICAgICAgICAgICAndXNlIHN0cmljdCdcclxuICAgICAgICAgICAgJHtjb25kaXRpb25GdW5jdGlvbnNEZWNsYXJlc31cclxuICAgICAgICAgICAgbGV0IHdpbmRvdyA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgbGV0IGRvY3VtZW50ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQgYWxlcnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGxldCBhID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICByZXR1cm4gJHtjb25kaXRpb259O1xyXG4gICAgICAgIGA7XHJcblxyXG4gICAgcHJvcHMucHVzaChleHByZXNzaW9uKTtcclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCBldmFsRnVuYyA9IG5ldyBGdW5jdGlvbiguLi5wcm9wcyk7XHJcbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gZXZhbEZ1bmMoLi4ucGFyYW1zKTtcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIGRlYnVnZ2VyOyAvLyBpbnRlbnRpb25hbGx5IGxlZnQgdG8gaGVscCB0cm91Ymxlc2hvb3RpbmcgaXNzdWVzXHJcbiAgICAgIGNvbnNvbGUubG9nKGVycik7XHJcbiAgICAgIHRocm93IGVycjtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBSZXNldCBhbGwgZGVwZW5kYW5jaWVzIGZvciBhbnkgZ2l2ZW4gY29uZGl0aW9uIGluIGEgY29tcG9uZW50XHJcbiAgKi9cclxuICBwdWJsaWMgcmVzZXREZXBlbmRhbmNpZXM8VCwgVT4oZm9ybVN0YXRlOiBGb3JtU3RhdGUsIGNvbmRpdGlvbjogc3RyaW5nLCBjb21wb25lbnQ6IEZvcm1Db21wb25lbnQ8VD4pOiBVIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgcmVnaXN0ZXJGdW5jdGlvbnMgPSB7XHJcbiAgICAgIEdFVChzY2hlbWE6IHN0cmluZykge1xyXG4gICAgICAgIGZvcm1TdGF0ZS5jb21wb25lbnRzID0gc2VsZi5zZXREZXBlbmRlbnRzKGZvcm1TdGF0ZS5jb21wb25lbnRzLCBzY2hlbWEsIGNvbXBvbmVudC5jb21wb25lbnRJZCk7XHJcbiAgICAgIH0sXHJcbiAgICAgIFNVTSguLi5zY2hlbWFzOiBzdHJpbmdbXSkge1xyXG4gICAgICAgIHNjaGVtYXMuZm9yRWFjaChzY2hlbWEgPT4gZm9ybVN0YXRlLmNvbXBvbmVudHMgPSBzZWxmLnNldERlcGVuZGVudHMoZm9ybVN0YXRlLmNvbXBvbmVudHMsIHNjaGVtYSwgY29tcG9uZW50LmNvbXBvbmVudElkKSk7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5kb0V2YWwoY29uZGl0aW9uLCByZWdpc3RlckZ1bmN0aW9ucyk7XHJcbiAgfVxyXG5cclxuICAvKlxyXG4gICAgRXZhbHVldGVzIHRoZSB2YWx1ZSBvZiBhbnkgZ2l2ZW4gY29uZGl0aW9uXHJcbiAgKi9cclxuICBwdWJsaWMgZXZhbHVhdGU8VCwgVT4oZGF0YTogVCwgY29uZGl0aW9uOiBzdHJpbmcpOiBVIHtcclxuICAgICd1c2Ugc3RyaWN0JztcclxuICAgIGNvbnN0IHNlbGYgPSB0aGlzO1xyXG4gICAgY29uc3QgZXZhbEZ1bmN0aW9ucyA9IHtcclxuICAgICAgR0VUKHNjaGVtYTogc3RyaW5nKSB7XHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VsZi5nZXRTY2hlbWFWYWx1ZShkYXRhLCBzY2hlbWEpO1xyXG4gICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCAmJiByZXN1bHQgIT09IG51bGwpXHJcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xyXG4gICAgICAgIGVsc2VcclxuICAgICAgICAgIHJldHVybiAnJztcclxuICAgICAgfSxcclxuICAgICAgU1VNKC4uLnNjaGVtYXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgbGV0IHRvdGFsID0gMDtcclxuICAgICAgICBzY2hlbWFzLmZvckVhY2goc2NoZW1hID0+IHtcclxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc2VsZi5nZXRTY2hlbWFWYWx1ZShkYXRhLCBzY2hlbWEpIGFzIG51bWJlcjtcclxuICAgICAgICAgIGlmICh2YWx1ZSAmJiAhaXNOYU4odmFsdWUpKVxyXG4gICAgICAgICAgICB0b3RhbCArPSB2YWx1ZTtcclxuICAgICAgICB9KTtcclxuICAgICAgICByZXR1cm4gdG90YWw7XHJcbiAgICAgIH1cclxuICAgIH07XHJcbiAgICByZXR1cm4gdGhpcy5kb0V2YWwoY29uZGl0aW9uLCBldmFsRnVuY3Rpb25zKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBldmFsdWF0ZUNvbmRpdGlvbjxUPihkYXRhOiBULCBjb25kaXRpb246IHN0cmluZyk6IEV2YWxSZXNwb25zZSB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IHsgdmFsdWU6IGZhbHNlLCBlcnJvcjogbnVsbCB9IGFzIEV2YWxSZXNwb25zZTtcclxuXHJcbiAgICBpZiAoY29uZGl0aW9uICYmIGNvbmRpdGlvbi50cmltKCkgIT09ICcnICYmIGNvbmRpdGlvbiAhPT0gJ2ZhbHNlJykge1xyXG5cclxuICAgICAgaWYgKGNvbmRpdGlvbiA9PT0gJ3RydWUnKSB7XHJcbiAgICAgICAgcmVzcG9uc2UudmFsdWUgPSB0cnVlO1xyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKCFkYXRhKVxyXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcclxuXHJcbiAgICAgIHRyeSB7XHJcbiAgICAgICAgcmVzcG9uc2UudmFsdWUgPSB0aGlzLmV2YWx1YXRlKGRhdGEsIGNvbmRpdGlvbik7XHJcbiAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgIHJlc3BvbnNlLmVycm9yID0gZXJyO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAocmVzcG9uc2UudmFsdWUgIT09IHRydWUpXHJcbiAgICAgICAgcmVzcG9uc2UudmFsdWUgPSBmYWxzZTtcclxuICAgIH1cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBldmFsdWF0ZVZhbHVlPFQ+KGRhdGE6IFQsIGV4cHJlc3Npb246IHN0cmluZyk6IEV2YWxSZXNwb25zZSB7XHJcbiAgICBjb25zdCByZXNwb25zZSA9IHsgdmFsdWU6IG51bGwsIGVycm9yOiBudWxsIH0gYXMgRXZhbFJlc3BvbnNlO1xyXG5cclxuICAgIGlmICghZGF0YSlcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIHJlc3BvbnNlLnZhbHVlID0gdGhpcy5ldmFsdWF0ZShkYXRhLCBleHByZXNzaW9uKTtcclxuICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICByZXNwb25zZS5lcnJvciA9IGVycjtcclxuICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgfVxyXG5cclxuICAgIGlmIChOdW1iZXIuaXNOYU4ocmVzcG9uc2UudmFsdWUpIHx8IHJlc3BvbnNlLnZhbHVlID09PSBJbmZpbml0eSlcclxuICAgICAgcmVzcG9uc2UudmFsdWUgPSBudWxsO1xyXG4gICAgZWxzZVxyXG4gICAgICByZXNwb25zZS52YWx1ZSA9IEhlbHBlclNlcnZpY2UuZGVlcENvcHkocmVzcG9uc2UudmFsdWUpO1xyXG5cclxuICAgIHJldHVybiByZXNwb25zZTtcclxuICB9XHJcblxyXG5cclxuICBwcml2YXRlIGdldFNjaGVtYVZhbHVlPFQsIFU+KGRhdGE6IFQsIHNjaGVtYTogc3RyaW5nKTogVSB7XHJcbiAgICBjb25zdCBldmFsRnVuYyA9IG5ldyBGdW5jdGlvbignZGF0YScsICdzY2hlbWEnLCBgcmV0dXJuIGRhdGEuJHtzY2hlbWF9YCk7XHJcbiAgICByZXR1cm4gZXZhbEZ1bmMoZGF0YSwgc2NoZW1hKSBhcyBVO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzZXREZXBlbmRlbnRzKGNvbXBvbmVudHM6IEZvcm1Db21wb25lbnRzLCBzY2hlbWE6IHN0cmluZywgY29tcG9uZW50SWQ6IHN0cmluZyk6IEZvcm1Db21wb25lbnRzIHtcclxuICAgIE9iamVjdC5rZXlzKGNvbXBvbmVudHMpLmZvckVhY2goKGtleSkgPT4ge1xyXG4gICAgICBjb25zdCBjb21wb25lbnQgPSBjb21wb25lbnRzW2tleV07XHJcbiAgICAgIGlmIChjb21wb25lbnQuc2NoZW1hID09PSBzY2hlbWEpIHtcclxuICAgICAgICBpZiAoIWNvbXBvbmVudC5kZXBlbmRlbnRzKVxyXG4gICAgICAgICAgY29tcG9uZW50LmRlcGVuZGVudHMgPSBbY29tcG9uZW50SWRdO1xyXG4gICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudC5kZXBlbmRlbnRzLmluZGV4T2YoY29tcG9uZW50SWQpID09PSAtMSlcclxuICAgICAgICAgIGNvbXBvbmVudC5kZXBlbmRlbnRzLnB1c2goY29tcG9uZW50SWQpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIHJldHVybiBjb21wb25lbnRzO1xyXG4gIH1cclxufVxyXG4iXX0=