UNPKG

@coorpacademy/progression-engine

Version:

92 lines (91 loc) 3.64 kB
"use strict"; exports.__esModule = true; exports.default = exports.DEFAULT_SOURCE = void 0; var _sample2 = _interopRequireDefault(require("lodash/fp/sample")); var _uniqBy2 = _interopRequireDefault(require("lodash/fp/uniqBy")); var _reverse2 = _interopRequireDefault(require("lodash/fp/reverse")); var _find2 = _interopRequireDefault(require("lodash/fp/find")); var _pipe2 = _interopRequireDefault(require("lodash/fp/pipe")); var _sortBy2 = _interopRequireDefault(require("lodash/fp/sortBy")); var _filter2 = _interopRequireDefault(require("lodash/fp/filter")); var _isEqual2 = _interopRequireDefault(require("lodash/fp/isEqual")); var _head2 = _interopRequireDefault(require("lodash/fp/head")); var _get2 = _interopRequireDefault(require("lodash/fp/get")); var _conditionOperators = _interopRequireDefault(require("./condition-operators")); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const DEFAULT_SOURCE = exports.DEFAULT_SOURCE = { type: 'slide', ref: '' }; const isRuleAvailable = source => chapterRule => { const isSameSource = (0, _isEqual2.default)(source, chapterRule.source); const hasSameType = (source && source.type) === chapterRule.source.type; const isGlobalRule = hasSameType && (0, _get2.default)('source.ref', chapterRule) === '*'; return isSameSource || isGlobalRule; }; const isSameType = refValue => value => { if (Array.isArray(value) && Array.isArray(refValue)) return value.every(isSameType(refValue[0])); return typeof refValue === typeof value; }; const matchWithState = (state, chapterRule) => { const conditions = chapterRule.conditions; return conditions.every(condition => { const { target, operator, values } = condition; switch (target.scope) { case 'slide': { const { ref, field } = target; const answerRecord = (0, _pipe2.default)(_reverse2.default, (0, _uniqBy2.default)('slideRef'), (0, _find2.default)({ slideRef: ref }))(state.allAnswers); if (!answerRecord) return false; const value = answerRecord[field]; const typedValues = values.filter(isSameType(value)); return (0, _conditionOperators.default)(operator, typedValues, value); } case 'variable': { const { field } = target; const variables = { lives: state.lives, stars: state.stars, ...state.variables }; const value = variables[field]; const typedValues = values.filter(isSameType(value)); return (0, _conditionOperators.default)(operator, typedValues, value); } /* istanbul ignore next */ default: { return false; } } }); }; const match = state => chapterRule => { if (!state) { return chapterRule.source.ref === '' && chapterRule.source.type === 'slide'; } return matchWithState(state, chapterRule); }; const selectRule = (rules, state) => { const targetedChapterRules = (0, _filter2.default)(isRuleAvailable(state ? state.nextContent : DEFAULT_SOURCE), rules); const sortedChapterRules = (0, _sortBy2.default)('priority', targetedChapterRules); const machedRules = sortedChapterRules.filter(match(state)); const priority = (0, _pipe2.default)(_head2.default, (0, _get2.default)('priority'))(machedRules); return (0, _pipe2.default)((0, _filter2.default)({ priority }), _sample2.default)(machedRules) || null; }; var _default = exports.default = selectRule; //# sourceMappingURL=select-rule.js.map