UNPKG

@coorpacademy/progression-engine

Version:

102 lines (76 loc) 3.26 kB
'use strict'; exports.__esModule = true; exports.DEFAULT_SOURCE = undefined; var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _get = require('lodash/fp/get'); var _get2 = _interopRequireDefault(_get); var _head = require('lodash/fp/head'); var _head2 = _interopRequireDefault(_head); var _isEqual = require('lodash/fp/isEqual'); var _isEqual2 = _interopRequireDefault(_isEqual); var _filter = require('lodash/fp/filter'); var _filter2 = _interopRequireDefault(_filter); var _sortBy = require('lodash/fp/sortBy'); var _sortBy2 = _interopRequireDefault(_sortBy); var _conditionOperators = require('./condition-operators'); var _conditionOperators2 = _interopRequireDefault(_conditionOperators); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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 = state.allAnswers.reverse().find(record => { return record.slideRef === ref; }); if (!answerRecord) return false; const value = answerRecord[field]; const typedValues = values.filter(isSameType(value)); return (0, _conditionOperators2.default)(operator, typedValues, value); } case 'variable': { const { field } = target; const variables = _extends({ lives: state.lives, stars: state.stars }, state.variables); const value = variables[field]; const typedValues = values.filter(isSameType(value)); return (0, _conditionOperators2.default)(operator, typedValues, value); } /* istanbul ignore next */ default: { return false; } } }); }; const selectRule = (rules, state) => { const targetedChapterRules = (0, _filter2.default)(isRuleAvailable(state ? state.nextContent : DEFAULT_SOURCE), rules); const sortedChapterRules = (0, _sortBy2.default)('priority', targetedChapterRules); if (!state) { return (0, _head2.default)(sortedChapterRules); } return sortedChapterRules.find(matchWithState(state)) || null; }; exports.default = selectRule; //# sourceMappingURL=select-rule.js.map