UNPKG

@formql/core

Version:

FormQL - A framework for building dynamic forms

138 lines 17.4 kB
import { HelperService } from '../services/helper.service'; export class RuleLogic { constructor() { this.evalFunctions = ['GET', 'SUM']; } /* Perform a condition evaluation */ doEval(condition, conditionFunctions) { const conditionFunctionsDeclares = Object.keys(conditionFunctions).map(x => `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') )`); const props = []; const params = []; params.push(condition); params.push(conditionFunctions); props.push('condition'); props.push('conditionFunctions'); const expression = ` 'use strict' ${conditionFunctionsDeclares} let window = undefined; let document = undefined; let alert = undefined; let a = undefined; return ${condition}; `; props.push(expression); try { const evalFunc = new Function(...props); const response = evalFunc(...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 */ resetDependancies(formState, condition, component) { 'use strict'; const self = this; const registerFunctions = { GET(schema) { formState.components = self.setDependents(formState.components, schema, component.componentId); }, SUM(...schemas) { schemas.forEach(schema => formState.components = self.setDependents(formState.components, schema, component.componentId)); } }; return this.doEval(condition, registerFunctions); } /* Evaluetes the value of any given condition */ evaluate(data, condition) { 'use strict'; const self = this; const evalFunctions = { GET(schema) { const result = self.getSchemaValue(data, schema); if (result !== undefined && result !== null) return result; else return ''; }, SUM(...schemas) { let total = 0; schemas.forEach(schema => { const value = self.getSchemaValue(data, schema); if (value && !isNaN(value)) total += value; }); return total; } }; return this.doEval(condition, evalFunctions); } evaluateCondition(data, condition) { const 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; } evaluateValue(data, expression) { const 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; } getSchemaValue(data, schema) { const evalFunc = new Function('data', 'schema', `return data.${schema}`); return evalFunc(data, schema); } setDependents(components, schema, componentId) { Object.keys(components).forEach((key) => { const 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; } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVsZS1sb2dpYy5qcyIsInNvdXJjZVJvb3QiOiJuZzovL0Bmb3JtcWwvY29yZS8iLCJzb3VyY2VzIjpbInZhbGlkYXRvcnMvcnVsZS1sb2dpYy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFM0QsTUFBTSxPQUFPLFNBQVM7SUFJcEI7UUFGUSxrQkFBYSxHQUFHLENBQUMsS0FBSyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBRXZCLENBQUM7SUFFakI7O01BRUU7SUFDTSxNQUFNLENBQUksU0FBaUIsRUFBRSxrQkFBMEI7UUFFN0QsTUFBTSwwQkFBMEIsR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUU3SCxJQUFJLFNBQVMsQ0FBQyxJQUFJLEVBQUUsS0FBSyxFQUFFO1lBQ3pCLE9BQU87UUFFVCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUNyRCxNQUFNLEtBQUssQ0FBQyw2REFBNkQsQ0FBQyxDQUFDO1FBRTdFLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztRQUNqQixNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUM7UUFHbEIsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2QixNQUFNLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFFaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUM7UUFFakMsTUFBTSxVQUFVLEdBQUc7O2NBRVQsMEJBQTBCOzs7OztxQkFLbkIs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QVEsRUFBRSxlQUFlLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDekUsT0FBTyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBTSxDQUFDO0lBQ3JDLENBQUM7SUFFTyxhQUFhLENBQUMsVUFBMEIsRUFBRSxNQUFjLEVBQUUsV0FBbUI7UUFDbkYsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtZQUN0QyxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDbEMsSUFBSSxTQUFTLENBQUMsTUFBTSxLQUFLLE1BQU0sRUFBRTtnQkFDL0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVO29CQUN2QixTQUFTLENBQUMsVUFBVSxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUM7cUJBQ2xDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUN2RCxTQUFTLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQzthQUMxQztRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxVQUFVLENBQUM7SUFDcEIsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRm9ybUNvbXBvbmVudCB9IGZyb20gJy4uL21vZGVscy9mb3JtLWNvbXBvbmVudC5tb2RlbCc7XHJcbmltcG9ydCB7IEZvcm1TdGF0ZSwgRm9ybUNvbXBvbmVudHMgfSBmcm9tICcuLi9tb2RlbHMvZm9ybS13aW5kb3cubW9kZWwnO1xyXG5pbXBvcnQgeyBFdmFsUmVzcG9uc2UgfSBmcm9tICcuLi9tb2RlbHMvdHlwZS5tb2RlbCc7XHJcbmltcG9ydCB7IEhlbHBlclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9oZWxwZXIuc2VydmljZSc7XHJcblxyXG5leHBvcnQgY2xhc3MgUnVsZUxvZ2ljIHtcclxuXHJcbiAgcHJpdmF0ZSBldmFsRnVuY3Rpb25zID0gWydHRVQnLCAnU1VNJ107XHJcblxyXG4gIGNvbnN0cnVjdG9yKCkgeyB9XHJcblxyXG4gIC8qXHJcbiAgICBQZXJmb3JtIGEgY29uZGl0aW9uIGV2YWx1YXRpb25cclxuICAqL1xyXG4gIHByaXZhdGUgZG9FdmFsPFU+KGNvbmRpdGlvbjogc3RyaW5nLCBjb25kaXRpb25GdW5jdGlvbnM6IG9iamVjdCk6IFUge1xyXG5cclxuICAgIGNvbnN0IGNvbmRpdGlvbkZ1bmN0aW9uc0RlY2xhcmVzID0gT2JqZWN0LmtleXMoY29uZGl0aW9uRnVuY3Rpb25zKS5tYXAoeCA9PiBgbGV0ICR7eH0gPSBjb25kaXRpb25GdW5jdGlvbnMuJHt4fTsgYCkuam9pbignJyk7XHJcblxyXG4gICAgaWYgKGNvbmRpdGlvbi50cmltKCkgPT09ICcnKVxyXG4gICAgICByZXR1cm47XHJcblxyXG4gICAgaWYgKHRoaXMuZXZhbEZ1bmN0aW9ucy5pbmRleE9mKGNvbmRpdGlvbi50cmltKCkpICE9PSAtMSlcclxuICAgICAgdGhyb3cgRXJyb3IoYEZ1bmNpdG9ucyBuZWVkIGEgcGFyYW1ldGVyIChlLmcuIEdFVCgnY29udGFjdC5maXJzdE5hbWUnKSApYCk7XHJcblxyXG4gICAgY29uc3QgcHJvcHMgPSBbXTtcclxuICAgIGNvbnN0IHBhcmFtcyA9IFtdO1xyXG5cclxuXHJcbiAgICBwYXJhbXMucHVzaChjb25kaXRpb24pO1xyXG4gICAgcGFyYW1zLnB1c2goY29uZGl0aW9uRnVuY3Rpb25zKTtcclxuXHJcbiAgICBwcm9wcy5wdXNoKCdjb25kaXRpb24nKTtcclxuICAgIHByb3BzLnB1c2goJ2NvbmRpdGlvbkZ1bmN0aW9ucycpO1xyXG5cclxuICAgIGNvbnN0IGV4cHJlc3Npb24gPSBgXHJcbiAgICAgICAgICAgICd1c2Ugc3RyaWN0J1xyXG4gICAgICAgICAgICAke2NvbmRpdGlvbkZ1bmN0aW9uc0RlY2xhcmVzfVxyXG4gICAgICAgICAgICBsZXQgd2luZG93ID0gdW5kZWZpbmVkO1xyXG4gICAgICAgICAgICBsZXQgZG9jdW1lbnQgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIGxldCBhbGVydCA9IHVuZGVmaW5lZDtcclxuICAgICAgICAgICAgbGV0IGEgPSB1bmRlZmluZWQ7XHJcbiAgICAgICAgICAgIHJldHVybiAke2NvbmRpdGlvbn07XHJcbiAgICAgICAgYDtcclxuXHJcbiAgICBwcm9wcy5wdXNoKGV4cHJlc3Npb24pO1xyXG5cclxuICAgIHRyeSB7XHJcbiAgICAgIGNvbnN0IGV2YWxGdW5jID0gbmV3IEZ1bmN0aW9uKC4uLnByb3BzKTtcclxuICAgICAgY29uc3QgcmVzcG9uc2UgPSBldmFsRnVuYyguLi5wYXJhbXMpO1xyXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9IGNhdGNoIChlcnIpIHtcclxuICAgICAgZGVidWdnZXI7IC8vIGludGVudGlvbmFsbHkgbGVmdCB0byBoZWxwIHRyb3VibGVzaG9vdGluZyBpc3N1ZXNcclxuICAgICAgY29uc29sZS5sb2coZXJyKTtcclxuICAgICAgdGhyb3cgZXJyO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLypcclxuICAgIFJlc2V0IGFsbCBkZXBlbmRhbmNpZXMgZm9yIGFueSBnaXZlbiBjb25kaXRpb24gaW4gYSBjb21wb25lbnRcclxuICAqL1xyXG4gIHB1YmxpYyByZXNldERlcGVuZGFuY2llczxULCBVPihmb3JtU3RhdGU6IEZvcm1TdGF0ZSwgY29uZGl0aW9uOiBzdHJpbmcsIGNvbXBvbmVudDogRm9ybUNvbXBvbmVudDxUPik6IFUge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCByZWdpc3RlckZ1bmN0aW9ucyA9IHtcclxuICAgICAgR0VUKHNjaGVtYTogc3RyaW5nKSB7XHJcbiAgICAgICAgZm9ybVN0YXRlLmNvbXBvbmVudHMgPSBzZWxmLnNldERlcGVuZGVudHMoZm9ybVN0YXRlLmNvbXBvbmVudHMsIHNjaGVtYSwgY29tcG9uZW50LmNvbXBvbmVudElkKTtcclxuICAgICAgfSxcclxuICAgICAgU1VNKC4uLnNjaGVtYXM6IHN0cmluZ1tdKSB7XHJcbiAgICAgICAgc2NoZW1hcy5mb3JFYWNoKHNjaGVtYSA9PiBmb3JtU3RhdGUuY29tcG9uZW50cyA9IHNlbGYuc2V0RGVwZW5kZW50cyhmb3JtU3RhdGUuY29tcG9uZW50cywgc2NoZW1hLCBjb21wb25lbnQuY29tcG9uZW50SWQpKTtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmRvRXZhbChjb25kaXRpb24sIHJlZ2lzdGVyRnVuY3Rpb25zKTtcclxuICB9XHJcblxyXG4gIC8qXHJcbiAgICBFdmFsdWV0ZXMgdGhlIHZhbHVlIG9mIGFueSBnaXZlbiBjb25kaXRpb25cclxuICAqL1xyXG4gIHB1YmxpYyBldmFsdWF0ZTxULCBVPihkYXRhOiBULCBjb25kaXRpb246IHN0cmluZyk6IFUge1xyXG4gICAgJ3VzZSBzdHJpY3QnO1xyXG4gICAgY29uc3Qgc2VsZiA9IHRoaXM7XHJcbiAgICBjb25zdCBldmFsRnVuY3Rpb25zID0ge1xyXG4gICAgICBHRVQoc2NoZW1hOiBzdHJpbmcpIHtcclxuICAgICAgICBjb25zdCByZXN1bHQgPSBzZWxmLmdldFNjaGVtYVZhbHVlKGRhdGEsIHNjaGVtYSk7XHJcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gbnVsbClcclxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICAgICAgZWxzZVxyXG4gICAgICAgICAgcmV0dXJuICcnO1xyXG4gICAgICB9LFxyXG4gICAgICBTVU0oLi4uc2NoZW1hczogc3RyaW5nW10pIHtcclxuICAgICAgICBsZXQgdG90YWwgPSAwO1xyXG4gICAgICAgIHNjaGVtYXMuZm9yRWFjaChzY2hlbWEgPT4ge1xyXG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBzZWxmLmdldFNjaGVtYVZhbHVlKGRhdGEsIHNjaGVtYSkgYXMgbnVtYmVyO1xyXG4gICAgICAgICAgaWYgKHZhbHVlICYmICFpc05hTih2YWx1ZSkpXHJcbiAgICAgICAgICAgIHRvdGFsICs9IHZhbHVlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHJldHVybiB0b3RhbDtcclxuICAgICAgfVxyXG4gICAgfTtcclxuICAgIHJldHVybiB0aGlzLmRvRXZhbChjb25kaXRpb24sIGV2YWxGdW5jdGlvbnMpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGV2YWx1YXRlQ29uZGl0aW9uPFQ+KGRhdGE6IFQsIGNvbmRpdGlvbjogc3RyaW5nKTogRXZhbFJlc3BvbnNlIHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0geyB2YWx1ZTogZmFsc2UsIGVycm9yOiBudWxsIH0gYXMgRXZhbFJlc3BvbnNlO1xyXG5cclxuICAgIGlmIChjb25kaXRpb24gJiYgY29uZGl0aW9uLnRyaW0oKSAhPT0gJycgJiYgY29uZGl0aW9uICE9PSAnZmFsc2UnKSB7XHJcblxyXG4gICAgICBpZiAoY29uZGl0aW9uID09PSAndHJ1ZScpIHtcclxuICAgICAgICByZXNwb25zZS52YWx1ZSA9IHRydWU7XHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoIWRhdGEpXHJcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xyXG5cclxuICAgICAgdHJ5IHtcclxuICAgICAgICByZXNwb25zZS52YWx1ZSA9IHRoaXMuZXZhbHVhdGUoZGF0YSwgY29uZGl0aW9uKTtcclxuICAgICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgICAgcmVzcG9uc2UuZXJyb3IgPSBlcnI7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmIChyZXNwb25zZS52YWx1ZSAhPT0gdHJ1ZSlcclxuICAgICAgICByZXNwb25zZS52YWx1ZSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGV2YWx1YXRlVmFsdWU8VD4oZGF0YTogVCwgZXhwcmVzc2lvbjogc3RyaW5nKTogRXZhbFJlc3BvbnNlIHtcclxuICAgIGNvbnN0IHJlc3BvbnNlID0geyB2YWx1ZTogbnVsbCwgZXJyb3I6IG51bGwgfSBhcyBFdmFsUmVzcG9uc2U7XHJcblxyXG4gICAgaWYgKCFkYXRhKVxyXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XHJcblxyXG4gICAgdHJ5IHtcclxuICAgICAgcmVzcG9uc2UudmFsdWUgPSB0aGlzLmV2YWx1YXRlKGRhdGEsIGV4cHJlc3Npb24pO1xyXG4gICAgfSBjYXRjaCAoZXJyKSB7XHJcbiAgICAgIHJlc3BvbnNlLmVycm9yID0gZXJyO1xyXG4gICAgICByZXR1cm4gcmVzcG9uc2U7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKE51bWJlci5pc05hTihyZXNwb25zZS52YWx1ZSkgfHwgcmVzcG9uc2UudmFsdWUgPT09IEluZmluaXR5KVxyXG4gICAgICByZXNwb25zZS52YWx1ZSA9IG51bGw7XHJcbiAgICBlbHNlXHJcbiAgICAgIHJlc3BvbnNlLnZhbHVlID0gSGVscGVyU2VydmljZS5kZWVwQ29weShyZXNwb25zZS52YWx1ZSk7XHJcblxyXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHByaXZhdGUgZ2V0U2NoZW1hVmFsdWU8VCwgVT4oZGF0YTogVCwgc2NoZW1hOiBzdHJpbmcpOiBVIHtcclxuICAgIGNvbnN0IGV2YWxGdW5jID0gbmV3IEZ1bmN0aW9uKCdkYXRhJywgJ3NjaGVtYScsIGByZXR1cm4gZGF0YS4ke3NjaGVtYX1gKTtcclxuICAgIHJldHVybiBldmFsRnVuYyhkYXRhLCBzY2hlbWEpIGFzIFU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHNldERlcGVuZGVudHMoY29tcG9uZW50czogRm9ybUNvbXBvbmVudHMsIHNjaGVtYTogc3RyaW5nLCBjb21wb25lbnRJZDogc3RyaW5nKTogRm9ybUNvbXBvbmVudHMge1xyXG4gICAgT2JqZWN0LmtleXMoY29tcG9uZW50cykuZm9yRWFjaCgoa2V5KSA9PiB7XHJcbiAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGNvbXBvbmVudHNba2V5XTtcclxuICAgICAgaWYgKGNvbXBvbmVudC5zY2hlbWEgPT09IHNjaGVtYSkge1xyXG4gICAgICAgIGlmICghY29tcG9uZW50LmRlcGVuZGVudHMpXHJcbiAgICAgICAgICBjb21wb25lbnQuZGVwZW5kZW50cyA9IFtjb21wb25lbnRJZF07XHJcbiAgICAgICAgZWxzZSBpZiAoY29tcG9uZW50LmRlcGVuZGVudHMuaW5kZXhPZihjb21wb25lbnRJZCkgPT09IC0xKVxyXG4gICAgICAgICAgY29tcG9uZW50LmRlcGVuZGVudHMucHVzaChjb21wb25lbnRJZCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gICAgcmV0dXJuIGNvbXBvbmVudHM7XHJcbiAgfVxyXG59XHJcbiJdfQ==